Bash-4.1 distribution source

This commit is contained in:
Chet Ramey 2011-11-21 20:51:19 -05:00
parent 89a92869e5
commit 0001803f0b
252 changed files with 51563 additions and 37176 deletions

View File

@ -334,6 +334,7 @@ examples/functions/manpage Tom Tromey
examples/functions/fstty Chet Ramey examples/functions/fstty Chet Ramey
examples/functions/jj.bash Chet Ramey examples/functions/jj.bash Chet Ramey
examples/functions/notify.bash Chet Ramey examples/functions/notify.bash Chet Ramey
examples/loadables/getconf.c J.T. Conklin
examples/scripts/shprompt Chet Ramey examples/scripts/shprompt Chet Ramey
examples/scripts/adventure.sh Chet Ramey, Doug Gwyn examples/scripts/adventure.sh Chet Ramey, Doug Gwyn
examples/scripts/bcsh.sh Chris Robertson, Chet Ramey examples/scripts/bcsh.sh Chris Robertson, Chet Ramey

374
CHANGES
View File

@ -1,3 +1,375 @@
This document details the changes between this version, bash-4.1-rc,
and the previous version, bash-4.1-beta.
1. Changes to Bash
a. Fixed a bug that caused printf to not return a partial value when it
encountered an error while converting an integer argument.
b. Fixed a bug that caused setting one of the compatNN options to not
turn off the others.
c. The (undocumented) --wordexp option is no longer included by default.
d. Fixed a bug in conditional command execution that caused it to not
correctly ignore the exit status under certain circumstances.
e. Added a configure-time check for correctly-working asprintf/snprintf.
f. Fixed some problems with line number calculation and display when sourcing
a file in an interactive shell.
g. Fixed a bug that caused the shell to crash when using `declare -A foo=bar'.
h. Fixed a bug that caused an off-by-one error when calculating the directories
to display with the PROMPT_DIRTRIM option.
2. Changes to Readline
a. Fixed a bug that caused applications using the callback interface to not
react to SIGINT (or other signals) until another character arrived.
------------------------------------------------------------------------------
This document details the changes between this version, bash-4.1-beta,
and the previous version, bash-4.1-alpha.
1. Changes to Bash
a. Fixed a bug in mapfile that caused the shell to crash if it was passed the
name of an associative array.
b. Fixed a bug that caused the shell to incorrectly split case patterns if
they contained characters in $IFS.
c. Fixed a bug that caused the shell to set $? to the wrong value when using
a construct ending with a variable assignment with set -x enabled and PS4
containing a command substitution.
d. Fixed a bug that caused the shell to read commands incorrectly if an
expansion error occurred under certain conditions in a user-specified
subshell.
e. Fixed a bug that caused the shell to set $? incorrectly if a parse error
occurred in an evaluation context ("eval", trap command, dot script, etc.)
f. Fixed a bug that caused the shell to attempt command substitution
completion within a single-quoted string.
g. Fixed a bug that caused the shell to insert an extra single quote during
word completion.
h. Fixed a bug that caused the shell to crash if invoked with the environment
variable EMACS having a null value.
i. Fixed a bug that caused bash to incorrectly report the presence of new
mail in a `maildir' environment.
j. Fixed a bug that caused the shell to not recognize a here-document ending
delimiter inside a command substitution.
k. Fixed a bug that caused the shell to crash when a a dynamic array variable
was assigned a scalar value.
2. Changes to Readline
3. New Features in Bash
a. The mapfile/readarray builtin no longer stores the commands it invokes via
callbacks in the history list.
b. There is a new `compat40' shopt option.
c. The < and > operators to [[ do string comparisons using the current locale
only if the compatibility level is greater than 40 (set to 41 by default).
4. New Features in Readline
------------------------------------------------------------------------------
This document details the changes between this version, bash-4.1-alpha,
and the previous version, bash-4.0-release.
1. Changes to Bash
a. Fixed bugs in the parser involving new parsing of the commands contained
in command substitution when the substitution is read.
b. Fixed a bug that caused the shell to dump core when performing programmable
completion using a shell function.
c. Fixed a bug in `mapfile' that caused it to invoke callbacks at the wrong
time.
d. Fixed a bug that caused the shell to dump core when listing jobs in the
`exit' builtin.
e. Fixed several bugs encountered when reading subscripts in associative
array assignments and expansions.
f. Fixed a bug that under some circumstances caused an associative array to
be converted to an indexed array.
g. Fixed a bug that caused syntax errors and SIGINT interrupts to not set
$? to a value > 128.
h. Fixed a bug that caused the shell to remove FIFOs associated with process
substitution inside shell functions.
i. Fixed a bug that caused terminal attributes to not be reset when the
`read' builtin timed out.
j. Fixed a bug in brace expansion that caused unwanted zero padding of the
expanded terms.
k. Fixed a bug that prevented the |& construct from working as intended when
used with a simple command with additional redirections.
l. Fixed a bug with the case statment ;& terminator that caused the shell to
dereference a NULL pointer.
m. Fixed a bug that caused assignment statements or redirections preceding
a simple command name to inhibit alias expansion.
n. Fixed the behavior of `set -u' to conform to the latest Posix interpretation:
every expansion of an unset variable except $@ and $* will cause the
shell to exit.
o. Fixed a bug that caused double-quoted expansions of $* inside word
expansions like ${x#$*} to not expand properly when $IFS is empty.
p. Fixed a bug that caused traps to set $LINENO to the wrong value when they
execute.
q. Fixed a bug that caused off-by-one errors when computing history lines in
the `fc' builtin.
r. Fixed a bug that caused some terminating signals to not exit the shell
quickly enough, forcing the kernel to send the signal (e.g., SIGSEGV)
multiple times.
s. Fixed a bug that caused the shell to attempt to add empty lines to the
history list when reading here documents.
t. Made some internal changes that dramatically speeds up sequential indexed
array access.
u. Fixed a bug that caused the shell to write past the end of a string when
completing a double-quoted string ending in a backslash.
v. Fixed a bug that caused the shell to replace too many characters when a
pattern match was null in a ${foo//bar} expansion.
w. Fixed bugs in the expansion of ** that caused duplicate directory names
and the contents of the current directory to be omitted.
x. Fixed a bug that caused $? to not be set correctly when referencing an
unset variable with set -u and set -e enabled.
y. Fixed a bug caused by executing an external program from the DEBUG trap
while a pipeline was running. The effect was to disturb the pipeline
state, occasionally causing it to hang.
z. Fixed a bug that caused the ** glob expansion to dump core if it
encountered an unsearchable directory.
aa. Fixed a bug that caused `command -v' and `command -V' to not honor the
path set by the -p option.
bb. Fixed a bug that caused brace expansion to take place too soon in some
compound array assignments.
cc. Fixed a bug that caused programmable completion functions' changes to
READLINE_POINT to not be reflected back to readline.
dd. Fixed a bug that caused the shell to dump core if a trap was executed
during a shell assignment statement.
ee. Fixed an off-by-one error when computing the number of positional
parameters for the ${@:0:n} expansion.
ff. Fixed a problem with setting COMP_CWORD for programmable completion
functions that could leave it set to -1.
gg. Fixed a bug that caused the ERR trap to be triggered in some cases where
`set -e' would not have caused the shell to exit.
hh. Fixed a bug that caused changes made by `compopt' to not persist past the
completion function in which compopt was executed.
ii. Fixed a bug that caused the list of hostname completions to not be cleared
when HOSTNAME was unset.
jj. Fixed a bug that caused variable expansion in here documents to look in
any temporary environment.
kk. Bash and readline can now convert file names between precomposed and
decomposed Unicode on Mac OS X ("keyboard" and file system forms,
respectively). This affects filename completion (using new
rl_filename_rewrite_hook), globbing, and readline redisplay.
ll. The ERR and EXIT traps now see a non-zero value for $? when a parser
error after set -e has been enabled causes the shell to exit.
mm. Fixed a bug that in brace expansion that caused zero-prefixed terms to
not contain the correct number of digits.
nn. Fixed a bug that caused the shell to free non-allocated memory when
unsetting an associative array which had had a value implicitly assigned
to index "0".
oo. Fixed a memory leak in the ${!prefix@} expansion.
pp. Fixed a bug that caused printf to not correctly report all write errors.
qq. Fixed a bug that caused single and double quotes to act as delimiters
when splitting a command line into words for programmable completion.
rr. Fixed a bug that caused ** globbing that caused **/path/* to match every
directory, not just those matching `path'.
ss. Fixed a bug that caused the shell to dump core when running `help' without
arguments if the terminal width was fewer than 7 characters.
2. Changes to Readline
a. The SIGWINCH signal handler now avoids calling the redisplay code if
one arrives while in the middle of redisplay.
b. Changes to the timeout code to make sure that timeout values greater
than one second are handled better.
c. Fixed a bug in the redisplay code that was triggered by a prompt
containing invisible characters exactly the width of the screen.
d. Fixed a bug in the redisplay code encountered when running in horizontal
scroll mode.
e. Fixed a bug that prevented menu completion from properly completing
filenames.
f. Fixed a redisplay bug caused by a multibyte character causing a line to
wrap.
g. Fixed a bug that caused key sequences of two characters to not be
recognized when a longer sequence identical in the first two characters
was bound.
h. Fixed a bug that caused history expansion to be attempted on $'...'
single-quoted strings.
i. Fixed a bug that caused incorrect redisplay when the prompt contained
multibyte characters in an `invisible' sequence bracketed by \[ and
\].
j. Fixed a bug that caused history expansion to short-circuit after
encountering a multibyte character.
3. New Features in Bash
a. Here-documents within $(...) command substitutions may once more be
delimited by the closing right paren, instead of requiring a newline.
b. Bash's file status checks (executable, readable, etc.) now take file
system ACLs into account on file systems that support them.
c. Bash now passes environment variables with names that are not valid
shell variable names through into the environment passed to child
processes.
d. The `execute-unix-command' readline function now attempts to clear and
reuse the current line rather than move to a new one after the command
executes.
e. `printf -v' can now assign values to array indices.
f. New `complete -E' and `compopt -E' options that work on the "empty"
completion: completion attempted on an empty command line.
g. New complete/compgen/compopt -D option to define a `default' completion:
a completion to be invoked on command for which no completion has been
defined. If this function returns 124, programmable completion is
attempted again, allowing a user to dynamically build a set of completions
as completion is attempted by having the default completion function
install individual completion functions each time it is invoked.
h. When displaying associative arrays, subscripts are now quoted.
i. Changes to dabbrev-expand to make it more `emacs-like': no space appended
after matches, completions are not sorted, and most recent history entries
are presented first.
j. The [[ and (( commands are now subject to the setting of `set -e' and the
ERR trap.
k. The source/. builtin now removes NUL bytes from the file before attempting
to parse commands.
l. There is a new configuration option (in config-top.h) that forces bash to
forward all history entries to syslog.
m. A new variable $BASHOPTS to export shell options settable using `shopt' to
child processes.
n. There is a new confgure option that forces the extglob option to be
enabled by default.
o. New variable $BASH_XTRACEFD; when set to an integer bash will write xtrace
output to that file descriptor.
p. If the optional left-hand-side of a redirection is of the form {var}, the
shell assigns the file descriptor used to $var or uses $var as the file
descriptor to move or close, depending on the redirection operator.
q. The < and > operators to the [[ conditional command now do string
comparison according to the current locale.
r. Programmable completion now uses the completion for `b' instead of `a'
when completion is attempted on a line like: a $(b c.
s. Force extglob on temporarily when parsing the pattern argument to
the == and != operators to the [[ command, for compatibility.
t. Changed the behavior of interrupting the wait builtin when a SIGCHLD is
received and a trap on SIGCHLD is set to be Posix-mode only.
u. The read builtin has a new `-N nchars' option, which reads exactly NCHARS
characters, ignoring delimiters like newline.
4. New Features in Readline
a. New bindable function: menu-complete-backward.
b. In the vi insertion keymap, C-n is now bound to menu-complete by default,
and C-p to menu-complete-backward.
c. When in vi command mode, repeatedly hitting ESC now does nothing, even
when ESC introduces a bound key sequence. This is closer to how
historical vi behaves.
d. New bindable function: skip-csi-sequence. Can be used as a default to
consume key sequences generated by keys like Home and End without having
to bind all keys.
e. New application-settable function: rl_filename_rewrite_hook. Can be used
to rewite or modify filenames read from the file system before they are
compared to the word to be completed.
f. New bindable variable: skip-completed-text, active when completing in the
middle of a word. If enabled, it means that characters in the completion
that match characters in the remainder of the word are "skipped" rather
than inserted into the line.
g. The pre-readline-6.0 version of menu completion is available as
"old-menu-complete" for users who do not like the readline-6.0 version.
h. New bindable variable: echo-control-characters. If enabled, and the
tty ECHOCTL bit is set, controls the echoing of characters corresponding
to keyboard-generated signals.
i. New bindable variable: enable-meta-key. Controls whether or not readline
sends the smm/rmm sequences if the terminal indicates it has a meta key
that enables eight-bit characters.
------------------------------------------------------------------------------
This document details the changes between this version, bash-4.0-release, This document details the changes between this version, bash-4.0-release,
and the previous version, bash-4.0-rc1. and the previous version, bash-4.0-rc1.
@ -601,7 +973,7 @@ bb. The command assigned to a key sequence with `bind -x' now sets two new
and cursor position by modifying READLINE_LINE_BUFFER and READLINE_POINT, and cursor position by modifying READLINE_LINE_BUFFER and READLINE_POINT,
respectively. respectively.
cc. There is a new >>& redirection operator, which appends the standard output cc. There is a new &>> redirection operator, which appends the standard output
and standard error to the named file. and standard error to the named file.
dd. The parser now understands `|&' as a synonym for `2>&1 |', which redirects dd. The parser now understands `|&' as a synonym for `2>&1 |', which redirects

59
COMPAT
View File

@ -1,10 +1,12 @@
Compatibility with previous versions
====================================
This document details the incompatibilities between this version of bash, This document details the incompatibilities between this version of bash,
bash-4.0, and the previous widely-available versions, bash-1.14 (which is bash-4.1, and the previous widely-available versions, bash-2.x (which is
still the `standard' version for a few Linux distributions) and bash-2.x. still the `standard' version for a few Linux distributions) and bash-3.x.
These were discovered by users of bash-2.x and 3.x, so this list is not These were discovered by users of bash-2.x and 3.x, so this list is not
comprehensive. Some of these incompatibilities occur between the current comprehensive. Some of these incompatibilities occur between the current
version and versions 2.0 and above. (The differences between bash-1.14 and version and versions 2.0 and above.
bash-2.0 were significant.)
1. Bash uses a new quoting syntax, $"...", to do locale-specific 1. Bash uses a new quoting syntax, $"...", to do locale-specific
string translation. Users who have relied on the (undocumented) string translation. Users who have relied on the (undocumented)
@ -277,7 +279,8 @@ bash-2.0 were significant.)
than a regular expression. than a regular expression.
34. Bash-4.0 allows the behavior in the previous item to be modified using 34. Bash-4.0 allows the behavior in the previous item to be modified using
the notion of a shell `compatibility level'. the notion of a shell `compatibility level'. If the compat31 shopt
option is set, quoting the pattern has no special effect.
35. Bash-3.2 (patched) and Bash-4.0 fix a bug that leaves the shell in an 35. Bash-3.2 (patched) and Bash-4.0 fix a bug that leaves the shell in an
inconsistent internal state following an assignment error. One of the inconsistent internal state following an assignment error. One of the
@ -311,10 +314,54 @@ bash-2.0 were significant.)
41. Beginning with bash-4.0, when one of the commands in a pipeline is killed 41. Beginning with bash-4.0, when one of the commands in a pipeline is killed
by a SIGINT while executing a command list, the shell acts as if it by a SIGINT while executing a command list, the shell acts as if it
received the interrupt. received the interrupt. This can be disabled by setting the compat31 or
compat32 shell options.
42. Bash-4.0 changes the handling of the set -e option so that the shell exits 42. Bash-4.0 changes the handling of the set -e option so that the shell exits
if a pipeline fails (and not just if the last command in the failing if a pipeline fails (and not just if the last command in the failing
pipeline is a simple command). This is not as Posix specifies. There is pipeline is a simple command). This is not as Posix specifies. There is
work underway to update this portion of the standard; the bash-4.0 work underway to update this portion of the standard; the bash-4.0
behavior attempts to capture the consensus at the time of release. behavior attempts to capture the consensus at the time of release.
43. Bash-4.0 fixes a Posix mode bug that caused the . (source) builtin to
search the current directory for its filename argument, even if "." is
not in $PATH. Posix says that the shell shouldn't look in $PWD in this
case.
44. Bash-4.1 uses the current locale when comparing strings using the < and
> operators to the `[[' command. This can be reverted to the previous
behavior by setting one of the `compatNN' shopt options.
Shell Compatibility Level
=========================
Bash-4.0 introduced the concept of a `shell compatibility level', specified
as a set of options to the shopt builtin (compat31, compat32, compat40 at
this writing). There is only one current compatibility level -- each
option is mutually exclusive. This list does not mention behavior that is
standard for a particular version (e.g., setting compat32 means that quoting
the rhs of the regexp matching operator quotes special regexp characters in
the word, which is default behavior in bash-3.2 and above).
compat31 set
- the < and > operators to the [[ command do not consider the current
locale when comparing strings
- quoting the rhs of the regexp matching operator (=~) has no
special effect
compat32 set
- the < and > operators to the [[ command do not consider the current
locale when comparing strings
compat40 set
- the < and > operators to the [[ command do not consider the current
locale when comparing strings
- interrupting a command list such as "a ; b ; c" causes the execution
of the entire list to be aborted
-------------------------------------------------------------------------------
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without any warranty.

File diff suppressed because it is too large Load Diff

View File

@ -326,6 +326,10 @@ does not provide the necessary support.
Include support for the extended pattern matching features Include support for the extended pattern matching features
described above under *note Pattern Matching::. described above under *note Pattern Matching::.
`--enable-extended-glob-default'
Set the default value of the EXTGLOB shell option described above
under *note The Shopt Builtin:: to be enabled.
`--enable-help-builtin' `--enable-help-builtin'
Include the `help' builtin, which displays help on shell builtins Include the `help' builtin, which displays help on shell builtins
and variables (*note Bash Builtins::). and variables (*note Bash Builtins::).

View File

@ -38,6 +38,7 @@ support d
tests d tests d
tests/misc d tests/misc d
ABOUT-NLS f ABOUT-NLS f
ChangeLog s CWRU/changelog
CHANGES f CHANGES f
COMPAT f COMPAT f
COPYING f COPYING f
@ -215,6 +216,7 @@ include/memalloc.h f
include/ocache.h f include/ocache.h f
include/posixdir.h f include/posixdir.h f
include/posixjmp.h f include/posixjmp.h f
include/posixselect.h f
include/posixstat.h f include/posixstat.h f
include/posixtime.h f include/posixtime.h f
include/posixwait.h f include/posixwait.h f
@ -351,6 +353,7 @@ lib/readline/histlib.h f
lib/readline/chardefs.h f lib/readline/chardefs.h f
lib/readline/posixdir.h f lib/readline/posixdir.h f
lib/readline/posixjmp.h f lib/readline/posixjmp.h f
lib/readline/posixselect.h f
lib/readline/posixstat.h f lib/readline/posixstat.h f
lib/readline/ansi_stdlib.h f lib/readline/ansi_stdlib.h f
lib/readline/rlstdc.h f lib/readline/rlstdc.h f
@ -384,6 +387,7 @@ lib/sh/fdprintf.c f
lib/sh/fmtullong.c f lib/sh/fmtullong.c f
lib/sh/fmtulong.c f lib/sh/fmtulong.c f
lib/sh/fmtumax.c f lib/sh/fmtumax.c f
lib/sh/fnxform.c f
lib/sh/fpurge.c f lib/sh/fpurge.c f
lib/sh/getcwd.c f lib/sh/getcwd.c f
lib/sh/getenv.c f lib/sh/getenv.c f
@ -392,6 +396,8 @@ lib/sh/input_avail.c f
lib/sh/itos.c f lib/sh/itos.c f
lib/sh/mailstat.c f lib/sh/mailstat.c f
lib/sh/makepath.c f lib/sh/makepath.c f
lib/sh/mbscasecmp.c f
lib/sh/mbschr.c f
lib/sh/mbscmp.c f lib/sh/mbscmp.c f
lib/sh/memset.c f lib/sh/memset.c f
lib/sh/mktime.c f lib/sh/mktime.c f
@ -408,9 +414,9 @@ lib/sh/shtty.c f
lib/sh/snprintf.c f lib/sh/snprintf.c f
lib/sh/spell.c f lib/sh/spell.c f
lib/sh/strcasecmp.c f lib/sh/strcasecmp.c f
lib/sh/strcasestr.c f
lib/sh/strerror.c f lib/sh/strerror.c f
lib/sh/strftime.c f lib/sh/strftime.c f
lib/sh/strindex.c f
lib/sh/stringlist.c f lib/sh/stringlist.c f
lib/sh/stringvec.c f lib/sh/stringvec.c f
lib/sh/strnlen.c f lib/sh/strnlen.c f
@ -432,7 +438,6 @@ lib/sh/ufuncs.c f
lib/sh/vprint.c f lib/sh/vprint.c f
lib/sh/wcsdup.c f lib/sh/wcsdup.c f
lib/sh/winsize.c f lib/sh/winsize.c f
lib/sh/xstrchr.c f
lib/sh/zcatfd.c f lib/sh/zcatfd.c f
lib/sh/zgetline.c f lib/sh/zgetline.c f
lib/sh/zmapfd.c f lib/sh/zmapfd.c f
@ -480,8 +485,12 @@ po/es.gmo f
po/es.po f po/es.po f
po/et.gmo f po/et.gmo f
po/et.po f po/et.po f
po/fi.gmo f
po/fi.po f
po/fr.gmo f po/fr.gmo f
po/fr.po f po/fr.po f
po/ga.gmo f
po/ga.po f
po/hu.gmo f po/hu.gmo f
po/hu.po f po/hu.po f
po/id.gmo f po/id.gmo f
@ -521,7 +530,6 @@ CWRU/misc/errlist.c f
CWRU/misc/hpux10-dlfcn.h f CWRU/misc/hpux10-dlfcn.h f
CWRU/PLATFORMS f CWRU/PLATFORMS f
CWRU/README f CWRU/README f
CWRU/audit-patch f
CWRU/changelog f CWRU/changelog f
CWRU/sh-redir-hack f CWRU/sh-redir-hack f
CWRU/mh-folder-comp f CWRU/mh-folder-comp f
@ -724,6 +732,7 @@ examples/misc/cshtobash f
tests/README f tests/README f
tests/COPYRIGHT f tests/COPYRIGHT f
tests/alias.tests f tests/alias.tests f
tests/alias1.sub f
tests/alias.right f tests/alias.right f
tests/appendop.tests f tests/appendop.tests f
tests/appendop.right f tests/appendop.right f
@ -752,6 +761,8 @@ tests/assoc1.sub f
tests/assoc2.sub f tests/assoc2.sub f
tests/assoc3.sub f tests/assoc3.sub f
tests/assoc4.sub f tests/assoc4.sub f
tests/assoc5.sub f
tests/assoc6.sub f
tests/braces.tests f tests/braces.tests f
tests/braces.right f tests/braces.right f
tests/builtins.tests f tests/builtins.tests f
@ -770,11 +781,14 @@ tests/casemod.tests f
tests/casemod.right f tests/casemod.right f
tests/comsub.tests f tests/comsub.tests f
tests/comsub.right f tests/comsub.right f
tests/comsub1.sub f
tests/comsub-eof.tests f tests/comsub-eof.tests f
tests/comsub-eof0.sub f tests/comsub-eof0.sub f
tests/comsub-eof1.sub f tests/comsub-eof1.sub f
tests/comsub-eof2.sub f tests/comsub-eof2.sub f
tests/comsub-eof3.sub f tests/comsub-eof3.sub f
tests/comsub-eof4.sub f
tests/comsub-eof5.sub f
tests/comsub-eof.right f tests/comsub-eof.right f
tests/comsub-posix.tests f tests/comsub-posix.tests f
tests/comsub-posix.right f tests/comsub-posix.right f
@ -791,12 +805,16 @@ tests/dbg-support.sub f
tests/dbg-support.tests f tests/dbg-support.tests f
tests/dbg-support2.right f tests/dbg-support2.right f
tests/dbg-support2.tests f tests/dbg-support2.tests f
tests/dbg-support3.sub f
tests/dollar-at-star f tests/dollar-at-star f
tests/dollar-at1.sub f tests/dollar-at1.sub f
tests/dollar-at2.sub f tests/dollar-at2.sub f
tests/dollar-at3.sub f
tests/dollar-star1.sub f tests/dollar-star1.sub f
tests/dollar-star2.sub f tests/dollar-star2.sub f
tests/dollar-star3.sub f tests/dollar-star3.sub f
tests/dollar-star4.sub f
tests/dollar-star5.sub f
tests/dollar.right f tests/dollar.right f
tests/dstack.tests f tests/dstack.tests f
tests/dstack.right f tests/dstack.right f
@ -818,6 +836,7 @@ tests/exp.tests f
tests/exp.right f tests/exp.right f
tests/exp1.sub f tests/exp1.sub f
tests/exp2.sub f tests/exp2.sub f
tests/exp3.sub f
tests/extglob.tests f tests/extglob.tests f
tests/extglob.right f tests/extglob.right f
tests/extglob1.sub f tests/extglob1.sub f
@ -839,9 +858,12 @@ tests/getopts4.sub f
tests/getopts5.sub f tests/getopts5.sub f
tests/getopts6.sub f tests/getopts6.sub f
tests/getopts7.sub f tests/getopts7.sub f
tests/glob-test f tests/glob.tests f
tests/glob1.sub f tests/glob1.sub f
tests/glob.right f tests/glob.right f
tests/globstar.tests f
tests/globstar.right f
tests/globstar1.sub f
tests/heredoc.tests f tests/heredoc.tests f
tests/heredoc.right f tests/heredoc.right f
tests/heredoc1.sub f tests/heredoc1.sub f
@ -853,6 +875,7 @@ tests/history.tests f
tests/history.right f tests/history.right f
tests/history.list f 444 tests/history.list f 444
tests/history1.sub f tests/history1.sub f
tests/history2.sub f
tests/ifs.tests f tests/ifs.tests f
tests/ifs.right f tests/ifs.right f
tests/ifs-posix.tests f tests/ifs-posix.tests f
@ -890,6 +913,7 @@ tests/new-exp7.sub f
tests/new-exp.right f tests/new-exp.right f
tests/nquote.tests f tests/nquote.tests f
tests/nquote.right f tests/nquote.right f
tests/nquote1.sub f
tests/nquote1.tests f tests/nquote1.tests f
tests/nquote1.right f tests/nquote1.right f
tests/nquote2.tests f tests/nquote2.tests f
@ -908,6 +932,7 @@ tests/prec.right f
tests/precedence f tests/precedence f
tests/printf.tests f tests/printf.tests f
tests/printf.right f tests/printf.right f
tests/printf2.sub f
tests/quote.tests f tests/quote.tests f
tests/quote.right f tests/quote.right f
tests/read.tests f tests/read.tests f
@ -968,6 +993,7 @@ tests/run-extglob3 f
tests/run-func f tests/run-func f
tests/run-getopts f tests/run-getopts f
tests/run-glob-test f tests/run-glob-test f
tests/run-globstar f
tests/run-heredoc f tests/run-heredoc f
tests/run-herestr f tests/run-herestr f
tests/run-histexpand f tests/run-histexpand f
@ -1007,11 +1033,13 @@ tests/run-tilde2 f
tests/run-trap f tests/run-trap f
tests/run-type f tests/run-type f
tests/run-varenv f tests/run-varenv f
tests/run-vredir f
tests/set-e.tests f tests/set-e.tests f
tests/set-e1.sub f tests/set-e1.sub f
tests/set-e2.sub f tests/set-e2.sub f
tests/set-e.right f tests/set-e.right f
tests/set-x.tests f tests/set-x.tests f
tests/set-x1.sub f
tests/set-x.right f tests/set-x.right f
tests/shopt.tests f tests/shopt.tests f
tests/shopt.right f tests/shopt.right f
@ -1028,15 +1056,24 @@ tests/trap.right f
tests/trap1.sub f 755 tests/trap1.sub f 755
tests/trap2.sub f 755 tests/trap2.sub f 755
tests/trap2a.sub f 755 tests/trap2a.sub f 755
tests/trap3.sub f
tests/type.tests f tests/type.tests f
tests/type.right f tests/type.right f
tests/type1.sub f tests/type1.sub f
tests/type2.sub f
tests/varenv.right f tests/varenv.right f
tests/varenv.sh f tests/varenv.sh f
tests/varenv1.sub f tests/varenv1.sub f
tests/varenv2.sub f tests/varenv2.sub f
tests/version f tests/version f
tests/version.mini f tests/version.mini f
tests/vredir.tests f
tests/vredir.right f
tests/vredir1.sub f
tests/vredir2.sub f
tests/vredir3.sub f
tests/vredir4.sub f
tests/vredir5.sub f
tests/misc/dev-tcp.tests f tests/misc/dev-tcp.tests f
tests/misc/perf-script f tests/misc/perf-script f
tests/misc/perftest f tests/misc/perftest f

View File

@ -1,4 +1,4 @@
# Makefile for bash-4.0, version 3.4 # Makefile for bash-4.0, version 3.5
# #
# Copyright (C) 1996-2009 Free Software Foundation, Inc. # Copyright (C) 1996-2009 Free Software Foundation, Inc.
@ -147,7 +147,7 @@ CCFLAGS = $(BASE_CCFLAGS) $(CPPFLAGS) $(CFLAGS)
CCFLAGS_FOR_BUILD = $(BASE_CCFLAGS) $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD) CCFLAGS_FOR_BUILD = $(BASE_CCFLAGS) $(CPPFLAGS_FOR_BUILD) $(CFLAGS_FOR_BUILD)
LDFLAGS = @LDFLAGS@ $(STATIC_LD) $(LOCAL_LDFLAGS) $(PROFILE_FLAGS) $(CFLAGS) LDFLAGS = @LDFLAGS@ $(STATIC_LD) $(LOCAL_LDFLAGS) $(PROFILE_FLAGS) $(CFLAGS)
LDFLAGS_FOR_BUILD = $(LDFLAGS) LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@ $(LOCAL_LDFLAGS) $(CFLAGS_FOR_BUILD)
INCLUDES = -I. @RL_INCLUDE@ -I$(srcdir) -I$(BASHINCDIR) -I$(LIBSRC) $(INTL_INC) INCLUDES = -I. @RL_INCLUDE@ -I$(srcdir) -I$(BASHINCDIR) -I$(LIBSRC) $(INTL_INC)
@ -198,14 +198,14 @@ SHLIB_SOURCE = ${SH_LIBSRC}/clktck.c ${SH_LIBSRC}/getcwd.c \
${SH_LIBSRC}/pathphys.c ${SH_LIBSRC}/stringlist.c \ ${SH_LIBSRC}/pathphys.c ${SH_LIBSRC}/stringlist.c \
${SH_LIBSRC}/stringvec.c ${SH_LIBSRC}/tmpfile.c \ ${SH_LIBSRC}/stringvec.c ${SH_LIBSRC}/tmpfile.c \
${SH_LIBSRC}/spell.c ${SH_LIBSRC}/strtrans.c \ ${SH_LIBSRC}/spell.c ${SH_LIBSRC}/strtrans.c \
${SH_LIBSRC}/strindex.c ${SH_LIBSRC}/shquote.c \ ${SH_LIBSRC}/strcasestr.c ${SH_LIBSRC}/shquote.c \
${SH_LIBSRC}/snprintf.c ${SH_LIBSRC}/mailstat.c \ ${SH_LIBSRC}/snprintf.c ${SH_LIBSRC}/mailstat.c \
${SH_LIBSRC}/fmtulong.c ${SH_LIBSRC}/fmtullong.c \ ${SH_LIBSRC}/fmtulong.c ${SH_LIBSRC}/fmtullong.c \
${SH_LIBSRC}/strtoll.c ${SH_LIBSRC}/strtoull.c \ ${SH_LIBSRC}/strtoll.c ${SH_LIBSRC}/strtoull.c \
${SH_LIBSRC}/strtoimax.c ${SH_LIBSRC}/strtoumax.c \ ${SH_LIBSRC}/strtoimax.c ${SH_LIBSRC}/strtoumax.c \
${SH_LIBSRC}/fmtumax.c ${SH_LIBSRC}/netconn.c \ ${SH_LIBSRC}/fmtumax.c ${SH_LIBSRC}/netconn.c \
${SH_LIBSRC}/mktime.c ${SH_LIBSRC}/strftime.c \ ${SH_LIBSRC}/mktime.c ${SH_LIBSRC}/strftime.c \
${SH_LIBSRC}/memset.c ${SH_LIBSRC}/xstrchr.c \ ${SH_LIBSRC}/memset.c ${SH_LIBSRC}/mbschr.c \
${SH_LIBSRC}/zcatfd.c ${SH_LIBSRC}/shmatch.c \ ${SH_LIBSRC}/zcatfd.c ${SH_LIBSRC}/shmatch.c \
${SH_LIBSRC}/strnlen.c ${SH_LIBSRC}/winsize.c \ ${SH_LIBSRC}/strnlen.c ${SH_LIBSRC}/winsize.c \
${SH_LIBSRC}/eaccess.c ${SH_LIBSRC}/wcsdup.c \ ${SH_LIBSRC}/eaccess.c ${SH_LIBSRC}/wcsdup.c \
@ -213,7 +213,8 @@ SHLIB_SOURCE = ${SH_LIBSRC}/clktck.c ${SH_LIBSRC}/getcwd.c \
${SH_LIBSRC}/zgetline.c ${SH_LIBSRC}/mbscmp.c \ ${SH_LIBSRC}/zgetline.c ${SH_LIBSRC}/mbscmp.c \
${SH_LIBSRC}/casemod.c ${SH_LIBSRC}/uconvert.c \ ${SH_LIBSRC}/casemod.c ${SH_LIBSRC}/uconvert.c \
${SH_LIBSRC}/ufuncs.c ${SH_LIBSRC}/fdprintf.c \ ${SH_LIBSRC}/ufuncs.c ${SH_LIBSRC}/fdprintf.c \
${SH_LIBSRC}/input_avail.c ${SH_LIBSRC}/input_avail.c ${SH_LIBSRC}/mbscasecmp.c \
${SH_LIBSRC}/fnxform.c
SHLIB_LIB = -lsh SHLIB_LIB = -lsh
SHLIB_LIBNAME = libsh.a SHLIB_LIBNAME = libsh.a
@ -347,6 +348,9 @@ INTL_INC = @INTL_INC@
LIBINTL_H = @LIBINTL_H@ LIBINTL_H = @LIBINTL_H@
# libiconv
LIBICONV = @LIBICONV@
# tests # tests
LIBINTL = @LIBINTL@ LIBINTL = @LIBINTL@
LTLIBINTL = @LTLIBINTL@ LTLIBINTL = @LTLIBINTL@
@ -393,10 +397,10 @@ BASHINCFILES = $(BASHINCDIR)/posixstat.h $(BASHINCDIR)/ansi_stdlib.h \
$(BASHINCDIR)/shtty.h $(BASHINCDIR)/typemax.h \ $(BASHINCDIR)/shtty.h $(BASHINCDIR)/typemax.h \
$(BASHINCDIR)/ocache.h $(BASHINCDIR)/ocache.h
LIBRARIES = $(SHLIB_LIB) $(READLINE_LIB) $(HISTORY_LIB) $(TERMCAP_LIB) $(GLOB_LIB) \ LIBRARIES = $(GLOB_LIB) $(SHLIB_LIB) $(READLINE_LIB) $(HISTORY_LIB) $(TERMCAP_LIB) \
$(TILDE_LIB) $(MALLOC_LIB) $(INTL_LIB) $(LOCAL_LIBS) $(TILDE_LIB) $(MALLOC_LIB) $(INTL_LIB) $(LIBICONV) $(LOCAL_LIBS)
LIBDEP = $(SHLIB_DEP) $(INTL_DEP) $(READLINE_DEP) $(HISTORY_DEP) $(TERMCAP_DEP) $(GLOB_DEP) \ LIBDEP = $(GLOB_DEP) $(SHLIB_DEP) $(INTL_DEP) $(READLINE_DEP) $(HISTORY_DEP) $(TERMCAP_DEP) \
$(TILDE_DEP) $(MALLOC_DEP) $(TILDE_DEP) $(MALLOC_DEP)
LIBRARY_LDFLAGS = $(READLINE_LDFLAGS) $(HISTORY_LDFLAGS) $(GLOB_LDFLAGS) \ LIBRARY_LDFLAGS = $(READLINE_LDFLAGS) $(HISTORY_LDFLAGS) $(GLOB_LDFLAGS) \
@ -595,7 +599,7 @@ $(READLINE_LIBRARY): config.h $(READLINE_SOURCE)
@( { test "${RL_LIBDIR}" = "${libdir}" && exit 0; } || \ @( { test "${RL_LIBDIR}" = "${libdir}" && exit 0; } || \
cd ${RL_LIBDIR} && $(MAKE) $(MFLAGS) libreadline.a) || exit 1 cd ${RL_LIBDIR} && $(MAKE) $(MFLAGS) libreadline.a) || exit 1
$(HISTORY_LIBRARY): config.h $(HISTORY_SOURCE) $(HISTORY_LIBRARY): config.h $(HISTORY_SOURCE) $(READLINE_DEP)
@echo making $@ in ${HIST_LIBDIR} @echo making $@ in ${HIST_LIBDIR}
@( { test "${HIST_LIBDIR}" = "${libdir}" && exit 0; } || \ @( { test "${HIST_LIBDIR}" = "${libdir}" && exit 0; } || \
cd ${HIST_LIBDIR} && $(MAKE) $(MFLAGS) libhistory.a) || exit 1 cd ${HIST_LIBDIR} && $(MAKE) $(MFLAGS) libhistory.a) || exit 1
@ -860,6 +864,7 @@ hashtest: hashlib.c
# Files that depend on the definitions in config-top.h, which are not meant # Files that depend on the definitions in config-top.h, which are not meant
# to be changed # to be changed
bashhist.o: config-top.h
shell.o: config-top.h shell.o: config-top.h
input.o: config-top.h input.o: config-top.h
y.tab.o: config-top.h y.tab.o: config-top.h
@ -935,7 +940,7 @@ general.o: ${BASHINCDIR}/chartypes.h
hashcmd.o: config.h ${BASHINCDIR}/posixstat.h bashtypes.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h hashcmd.o: config.h ${BASHINCDIR}/posixstat.h bashtypes.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
hashcmd.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h hashcmd.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h
hashcmd.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashcmd.h hashcmd.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashcmd.h
hashcmd.o: execute_cmd.h findcmd.h ${BASHINCDIR}/stdc.h hashlib.h hashcmd.o: execute_cmd.h findcmd.h ${BASHINCDIR}/stdc.h pathnames.h hashlib.h
hashlib.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h hashlib.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
hashlib.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h hashlib.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h
hashlib.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h hashlib.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h
@ -943,6 +948,7 @@ hashlib.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h
hashlib.o: make_cmd.h subst.h sig.h pathnames.h externs.h hashlib.o: make_cmd.h subst.h sig.h pathnames.h externs.h
input.o: config.h bashtypes.h ${BASHINCDIR}/filecntl.h ${BASHINCDIR}/posixstat.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h input.o: config.h bashtypes.h ${BASHINCDIR}/filecntl.h ${BASHINCDIR}/posixstat.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
input.o: command.h ${BASHINCDIR}/stdc.h general.h xmalloc.h input.h error.h externs.h input.o: command.h ${BASHINCDIR}/stdc.h general.h xmalloc.h input.h error.h externs.h
input.o: quit.h
list.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h list.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h
list.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h list.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h
list.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h list.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h
@ -1005,7 +1011,7 @@ sig.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array
sig.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h sig.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h
sig.o: make_cmd.h subst.h sig.h pathnames.h externs.h sig.o: make_cmd.h subst.h sig.h pathnames.h externs.h
sig.o: jobs.h siglist.h trap.h $(DEFSRC)/common.h bashline.h bashhist.h sig.o: jobs.h siglist.h trap.h $(DEFSRC)/common.h bashline.h bashhist.h
siglist.o: config.h bashtypes.h siglist.h trap.h siglist.o: config.h bashtypes.h siglist.h trap.h
stringlib.o: bashtypes.h ${BASHINCDIR}/chartypes.h stringlib.o: bashtypes.h ${BASHINCDIR}/chartypes.h
stringlib.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h stringlib.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h
stringlib.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h stringlib.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h
@ -1022,6 +1028,7 @@ subst.o: mailcheck.h input.h $(DEFSRC)/getopt.h $(DEFSRC)/common.h
subst.o: bashline.h bashhist.h ${GLOB_LIBSRC}/strmatch.h subst.o: bashline.h bashhist.h ${GLOB_LIBSRC}/strmatch.h
subst.o: ${BASHINCDIR}/chartypes.h subst.o: ${BASHINCDIR}/chartypes.h
subst.o: ${BASHINCDIR}/shmbutil.h subst.o: ${BASHINCDIR}/shmbutil.h
subst.o: ${DEFDIR}/builtext.h
test.o: bashtypes.h ${BASHINCDIR}/posixstat.h ${BASHINCDIR}/filecntl.h test.o: bashtypes.h ${BASHINCDIR}/posixstat.h ${BASHINCDIR}/filecntl.h
test.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h test.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h
test.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h test.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h
@ -1034,7 +1041,7 @@ trap.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h arra
trap.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h trap.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h
trap.o: make_cmd.h subst.h sig.h pathnames.h externs.h trap.o: make_cmd.h subst.h sig.h pathnames.h externs.h
trap.o: signames.h $(DEFSRC)/common.h trap.o: signames.h $(DEFSRC)/common.h
trap.o: ${DEFDIR}/builtext.h trap.o: ${DEFDIR}/builtext.h jobs.h
unwind_prot.o: config.h bashtypes.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h command.h ${BASHINCDIR}/stdc.h unwind_prot.o: config.h bashtypes.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h command.h ${BASHINCDIR}/stdc.h
unwind_prot.o: general.h xmalloc.h unwind_prot.h quit.h sig.h unwind_prot.o: general.h xmalloc.h unwind_prot.h quit.h sig.h
variables.o: config.h bashtypes.h ${BASHINCDIR}/posixstat.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h variables.o: config.h bashtypes.h ${BASHINCDIR}/posixstat.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
@ -1045,7 +1052,7 @@ variables.o: make_cmd.h subst.h sig.h pathnames.h externs.h
variables.o: flags.h execute_cmd.h mailcheck.h input.h $(DEFSRC)/common.h variables.o: flags.h execute_cmd.h mailcheck.h input.h $(DEFSRC)/common.h
variables.o: findcmd.h bashhist.h hashcmd.h pathexp.h variables.o: findcmd.h bashhist.h hashcmd.h pathexp.h
variables.o: pcomplete.h ${BASHINCDIR}/chartypes.h variables.o: pcomplete.h ${BASHINCDIR}/chartypes.h
variables.o: ${BASHINCDIR}/posixtime.h variables.o: ${BASHINCDIR}/posixtime.h assoc.h
version.o: conftypes.h patchlevel.h version.h version.o: conftypes.h patchlevel.h version.h
xmalloc.o: config.h bashtypes.h ${BASHINCDIR}/ansi_stdlib.h error.h xmalloc.o: config.h bashtypes.h ${BASHINCDIR}/ansi_stdlib.h error.h
@ -1056,7 +1063,7 @@ jobs.o: bashansi.h ${BASHINCDIR}/ansi_stdlib.h
jobs.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h jobs.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h
jobs.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h jobs.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h
jobs.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h jobs.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h
jobs.o: make_cmd.h subst.h sig.h pathnames.h externs.h jobs.o: execute_cmd.h make_cmd.h subst.h sig.h pathnames.h externs.h
jobs.o: jobs.h flags.h $(DEFSRC)/common.h $(DEFDIR)/builtext.h jobs.o: jobs.h flags.h $(DEFSRC)/common.h $(DEFDIR)/builtext.h
jobs.o: ${BASHINCDIR}/posixwait.h ${BASHINCDIR}/unionwait.h jobs.o: ${BASHINCDIR}/posixwait.h ${BASHINCDIR}/unionwait.h
jobs.o: ${BASHINCDIR}/posixtime.h jobs.o: ${BASHINCDIR}/posixtime.h
@ -1077,7 +1084,7 @@ arrayfunc.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
arrayfunc.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h arrayfunc.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h
arrayfunc.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h arrayfunc.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h
arrayfunc.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h arrayfunc.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h
arrayfunc.o: make_cmd.h subst.h sig.h pathnames.h externs.h arrayfunc.o: make_cmd.h subst.h sig.h pathnames.h externs.h pathexp.h
arrayfunc.o: $(DEFSRC)/common.h arrayfunc.o: $(DEFSRC)/common.h
arrayfunc.o: ${BASHINCDIR}/shmbutil.h arrayfunc.o: ${BASHINCDIR}/shmbutil.h
assoc.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h assoc.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
@ -1130,13 +1137,12 @@ bashline.o: builtins.h bashhist.h bashline.h execute_cmd.h findcmd.h pathexp.h
bashline.o: $(DEFSRC)/common.h $(GLOB_LIBSRC)/glob.h alias.h bashline.o: $(DEFSRC)/common.h $(GLOB_LIBSRC)/glob.h alias.h
bashline.o: pcomplete.h ${BASHINCDIR}/chartypes.h input.h bashline.o: pcomplete.h ${BASHINCDIR}/chartypes.h input.h
bracecomp.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h bracecomp.o: config.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
bracecomp.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h bracecomp.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h
bracecomp.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h bracecomp.o: command.h ${BASHINCDIR}/stdc.h error.h
bracecomp.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h
bracecomp.o: array.h hashlib.h alias.h builtins.h
bracecomp.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h bracecomp.o: quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h
bracecomp.o: make_cmd.h subst.h sig.h pathnames.h externs.h bracecomp.o: make_cmd.h subst.h sig.h pathnames.h externs.h
bracecomp.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h command.h hashlib.h builtins.h general.h xmalloc.h
bracecomp.o: quit.h alias.h config.h variables.h arrayfunc.h conftypes.h
bracecomp.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
# library dependencies # library dependencies
@ -1224,7 +1230,7 @@ builtins/evalstring.o: ${BASHINCDIR}/memalloc.h variables.h arrayfunc.h conftype
builtins/evalstring.o: quit.h unwind_prot.h ${BASHINCDIR}/maxpath.h jobs.h builtins.h builtins/evalstring.o: quit.h unwind_prot.h ${BASHINCDIR}/maxpath.h jobs.h builtins.h
builtins/evalstring.o: dispose_cmd.h make_cmd.h subst.h externs.h builtins/evalstring.o: dispose_cmd.h make_cmd.h subst.h externs.h
builtins/evalstring.o: jobs.h builtins.h flags.h input.h execute_cmd.h builtins/evalstring.o: jobs.h builtins.h flags.h input.h execute_cmd.h
builtins/evalstring.o: bashhist.h $(DEFSRC)/common.h builtins/evalstring.o: bashhist.h $(DEFSRC)/common.h pathnames.h
builtins/getopt.o: config.h ${BASHINCDIR}/memalloc.h builtins/getopt.o: config.h ${BASHINCDIR}/memalloc.h
builtins/getopt.o: shell.h syntax.h bashjmp.h command.h general.h xmalloc.h error.h builtins/getopt.o: shell.h syntax.h bashjmp.h command.h general.h xmalloc.h error.h
builtins/getopt.o: variables.h arrayfunc.h conftypes.h quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h builtins/getopt.o: variables.h arrayfunc.h conftypes.h quit.h ${BASHINCDIR}/maxpath.h unwind_prot.h dispose_cmd.h
@ -1235,80 +1241,89 @@ builtins/mkbuiltins.o: bashansi.h ${BASHINCDIR}/ansi_stdlib.h
# builtin def files # builtin def files
builtins/alias.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/alias.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/alias.o: quit.h $(DEFSRC)/common.h builtins/alias.o: quit.h $(DEFSRC)/common.h pathnames.h
builtins/alias.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h command.h ${BASHINCDIR}/stdc.h unwind_prot.h builtins/alias.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h command.h ${BASHINCDIR}/stdc.h unwind_prot.h
builtins/alias.o: dispose_cmd.h make_cmd.h subst.h externs.h variables.h arrayfunc.h conftypes.h builtins/alias.o: dispose_cmd.h make_cmd.h subst.h externs.h variables.h arrayfunc.h conftypes.h
builtins/bind.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/bind.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/bind.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/bind.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/bind.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h builtins/bind.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h
builtins/bind.o: $(DEFSRC)/bashgetopt.h builtins/bind.o: $(DEFSRC)/bashgetopt.h pathnames.h
builtins/break.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/break.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/break.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h builtins/break.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h
builtins/break.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/break.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/break.o: pathnames.h
builtins/builtin.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/builtin.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/builtin.o: quit.h $(DEFSRC)/common.h $(DEFSRC)/bashgetopt.h builtins/builtin.o: quit.h $(DEFSRC)/common.h $(DEFSRC)/bashgetopt.h
builtins/builtin.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/builtin.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/builtin.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/builtin.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/builtin.o: pathnames.h
builtins/caller.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/caller.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/caller.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/caller.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/caller.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/caller.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/caller.o: $(DEFSRC)/common.h quit.h builtins/caller.o: $(DEFSRC)/common.h quit.h
builtins/caller.o: ${BASHINCDIR}/chartypes.h bashtypes.h builtins/caller.o: ${BASHINCDIR}/chartypes.h bashtypes.h
builtins/caller.o: ${DEFDIR}/builtext.h builtins/caller.o: ${DEFDIR}/builtext.h pathnames.h
builtins/cd.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/cd.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/cd.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/cd.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/cd.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/cd.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/cd.o: $(DEFSRC)/common.h quit.h builtins/cd.o: $(DEFSRC)/common.h quit.h pathnames.h
builtins/command.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/command.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/command.o: quit.h $(DEFSRC)/bashgetopt.h builtins/command.o: quit.h $(DEFSRC)/bashgetopt.h
builtins/command.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/command.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/command.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/command.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h pathnames.h
builtins/declare.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/declare.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/declare.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h builtins/declare.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h
builtins/declare.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/declare.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/declare.o: $(DEFSRC)/bashgetopt.h builtins/declare.o: $(DEFSRC)/bashgetopt.h pathnames.h
builtins/echo.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/echo.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/echo.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h builtins/echo.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h
builtins/echo.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/echo.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/echo.o: pathnames.h
builtins/enable.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/enable.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/enable.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h builtins/enable.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h
builtins/enable.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/enable.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/enable.o: pcomplete.h builtins/enable.o: pcomplete.h pathnames.h
builtins/eval.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/eval.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/eval.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h builtins/eval.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h
builtins/eval.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/eval.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/exec.o: bashtypes.h builtins/eval.o: pathnames.h
builtins/exec.o: bashtypes.h pathnames.h
builtins/exec.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/exec.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/exec.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/exec.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/exec.o: dispose_cmd.h make_cmd.h subst.h externs.h execute_cmd.h builtins/exec.o: dispose_cmd.h make_cmd.h subst.h externs.h execute_cmd.h
builtins/exec.o: findcmd.h flags.h quit.h $(DEFSRC)/common.h ${BASHINCDIR}/stdc.h builtins/exec.o: findcmd.h flags.h quit.h $(DEFSRC)/common.h ${BASHINCDIR}/stdc.h
builtins/exec.o: pathnames.h
builtins/exit.o: bashtypes.h builtins/exit.o: bashtypes.h
builtins/exit.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/exit.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/exit.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h builtins/exit.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h
builtins/exit.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/exit.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/exit.o: pathnames.h
builtins/fc.o: bashtypes.h ${BASHINCDIR}/posixstat.h builtins/fc.o: bashtypes.h ${BASHINCDIR}/posixstat.h
builtins/fc.o: bashansi.h ${BASHINCDIR}/ansi_stdlib.h builtins.h command.h ${BASHINCDIR}/stdc.h builtins/fc.o: bashansi.h ${BASHINCDIR}/ansi_stdlib.h builtins.h command.h ${BASHINCDIR}/stdc.h
builtins/fc.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/fc.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/fc.o: flags.h unwind_prot.h variables.h arrayfunc.h conftypes.h shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h builtins/fc.o: flags.h unwind_prot.h variables.h arrayfunc.h conftypes.h shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h
builtins/fc.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h quit.h builtins/fc.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h quit.h
builtins/fc.o: $(DEFSRC)/bashgetopt.h bashhist.h builtins/fc.o: $(DEFSRC)/bashgetopt.h bashhist.h pathnames.h
builtins/fc.o: ${BASHINCDIR}/chartypes.h builtins/fc.o: ${BASHINCDIR}/chartypes.h
builtins/fg_bg.o: bashtypes.h $(DEFSRC)/bashgetopt.h builtins/fg_bg.o: bashtypes.h $(DEFSRC)/bashgetopt.h
builtins/fg_bg.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/fg_bg.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/fg_bg.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h builtins/fg_bg.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h
builtins/fg_bg.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/fg_bg.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/fg_bg.o: pathnames.h
builtins/getopts.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/getopts.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/getopts.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h builtins/getopts.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h
builtins/getopts.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/getopts.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/getopts.o: pathnames.h
builtins/hash.o: bashtypes.h builtins/hash.o: bashtypes.h
builtins/hash.o: builtins.h command.h findcmd.h ${BASHINCDIR}/stdc.h $(DEFSRC)/common.h builtins/hash.o: builtins.h command.h findcmd.h ${BASHINCDIR}/stdc.h $(DEFSRC)/common.h
builtins/hash.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/hash.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/hash.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h builtins/hash.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h
builtins/hash.o: pathnames.h
builtins/help.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/help.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/help.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/help.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/help.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h builtins/help.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h
builtins/help.o: $(GLOB_LIBSRC)/glob.h builtins/help.o: $(GLOB_LIBSRC)/glob.h pathnames.h
builtins/history.o: bashtypes.h builtins/history.o: bashtypes.h pathnames.h
builtins/history.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/history.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/history.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/history.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/history.o: ${BASHINCDIR}/filecntl.h shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h builtins/history.o: ${BASHINCDIR}/filecntl.h shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h
@ -1316,89 +1331,106 @@ builtins/history.o: bashhist.h variables.h arrayfunc.h conftypes.h
builtins/inlib.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/inlib.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/inlib.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h builtins/inlib.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h quit.h
builtins/inlib.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/inlib.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/inlib.o: pathnames.h
builtins/jobs.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/jobs.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/jobs.o: quit.h $(DEFSRC)/bashgetopt.h builtins/jobs.o: quit.h $(DEFSRC)/bashgetopt.h
builtins/jobs.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/jobs.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/jobs.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/jobs.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/jobs.o: pathnames.h
builtins/kill.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/kill.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/kill.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/kill.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/kill.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h trap.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/kill.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h trap.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/kill.o: pathnames.h
builtins/let.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/let.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/let.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/let.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/let.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/let.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/let.o: pathnames.h
builtins/printf.o: config.h ${BASHINCDIR}/memalloc.h bashjmp.h command.h error.h builtins/printf.o: config.h ${BASHINCDIR}/memalloc.h bashjmp.h command.h error.h
builtins/printf.o: general.h xmalloc.h quit.h dispose_cmd.h make_cmd.h subst.h builtins/printf.o: general.h xmalloc.h quit.h dispose_cmd.h make_cmd.h subst.h
builtins/printf.o: externs.h sig.h pathnames.h shell.h syntax.h unwind_prot.h builtins/printf.o: externs.h sig.h pathnames.h shell.h syntax.h unwind_prot.h
builtins/printf.o: variables.h arrayfunc.h conftypes.h ${BASHINCDIR}/stdc.h $(DEFSRC)/bashgetopt.h builtins/printf.o: variables.h arrayfunc.h conftypes.h ${BASHINCDIR}/stdc.h $(DEFSRC)/bashgetopt.h
builtins/printf.o: ${BASHINCDIR}/chartypes.h builtins/printf.o: ${BASHINCDIR}/chartypes.h
builtins/pushd.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/pushd.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/pushd.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/pushd.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/pushd.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/pushd.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/pushd.o: $(DEFSRC)/common.h builtins/pushd.o: $(DEFSRC)/common.h pathnames.h
builtins/read.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/read.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/read.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/read.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/read.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/read.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/read.o: pathnames.h
builtins/return.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/return.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/return.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/return.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/return.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/return.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/return.o: pathnames.h
builtins/set.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/set.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/set.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/set.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/set.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h flags.h builtins/set.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h flags.h
builtins/set.o: pathnames.h
builtins/setattr.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/setattr.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/setattr.o: quit.h $(DEFSRC)/common.h $(DEFSRC)/bashgetopt.h builtins/setattr.o: quit.h $(DEFSRC)/common.h $(DEFSRC)/bashgetopt.h
builtins/setattr.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/setattr.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/setattr.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/setattr.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/setattr.o: pathnames.h
builtins/shift.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/shift.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/shift.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/shift.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/shift.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/shift.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/shift.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/shift.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/shift.o: pathnames.h
builtins/shopt.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h builtins/shopt.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h
builtins/shopt.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h builtins/shopt.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h
builtins/shopt.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h unwind_prot.h variables.h arrayfunc.h conftypes.h ${BASHINCDIR}/maxpath.h builtins/shopt.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h unwind_prot.h variables.h arrayfunc.h conftypes.h ${BASHINCDIR}/maxpath.h
builtins/shopt.o: $(DEFSRC)/common.h $(DEFSRC)/bashgetopt.h builtins/shopt.o: $(DEFSRC)/common.h $(DEFSRC)/bashgetopt.h pathnames.h
builtins/shopt.o: bashhist.h
builtins/source.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/source.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/source.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/source.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/source.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/source.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/source.o: findcmd.h $(DEFSRC)/bashgetopt.h flags.h trap.h builtins/source.o: findcmd.h $(DEFSRC)/bashgetopt.h flags.h trap.h
builtins/source.o: pathnames.h
builtins/suspend.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/suspend.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/suspend.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/suspend.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/suspend.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/suspend.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/suspend.o: pathnames.h
builtins/test.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/test.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/test.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/test.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/test.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/test.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/test.o: test.h builtins/test.o: test.h pathnames.h
builtins/times.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/times.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/times.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/times.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/times.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/times.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/times.o: pathnames.h
builtins/trap.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/trap.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/trap.o: quit.h $(DEFSRC)/common.h builtins/trap.o: quit.h $(DEFSRC)/common.h
builtins/trap.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/trap.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/trap.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/trap.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/trap.o: pathnames.h
builtins/type.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/type.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/type.o: quit.h $(DEFSRC)/common.h findcmd.h builtins/type.o: quit.h $(DEFSRC)/common.h findcmd.h
builtins/type.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/type.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/type.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/type.o: dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/type.o: pathnames.h
builtins/ulimit.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/ulimit.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/ulimit.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/ulimit.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/ulimit.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/ulimit.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/ulimit.o: pathnames.h
builtins/umask.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/umask.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/umask.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/umask.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/umask.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/umask.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/umask.o: ${BASHINCDIR}/chartypes.h builtins/umask.o: ${BASHINCDIR}/chartypes.h pathnames.h
builtins/wait.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/wait.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/wait.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/wait.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/wait.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/wait.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/wait.o: ${BASHINCDIR}/chartypes.h builtins/wait.o: ${BASHINCDIR}/chartypes.h pathnames.h
builtins/complete.o: config.h shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h builtins/complete.o: config.h shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h
builtins/complete.o: unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/complete.o: unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/complete.o: bashtypes.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h builtins/complete.o: bashtypes.h bashansi.h ${BASHINCDIR}/ansi_stdlib.h
builtins/complete.o: builtins.h builtins/complete.o: builtins.h pathnames.h
builtins/complete.o: pcomplete.h builtins/complete.o: pcomplete.h
builtins/complete.o: ${DEFSRC}/common.h ${DEFSRC}/bashgetopt.h builtins/complete.o: ${DEFSRC}/common.h ${DEFSRC}/bashgetopt.h
builtins/mapfile.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h builtins/mapfile.o: command.h config.h ${BASHINCDIR}/memalloc.h error.h general.h xmalloc.h ${BASHINCDIR}/maxpath.h
builtins/mapfile.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h builtins/mapfile.o: quit.h dispose_cmd.h make_cmd.h subst.h externs.h ${BASHINCDIR}/stdc.h
builtins/mapfile.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h builtins/mapfile.o: shell.h syntax.h bashjmp.h ${BASHINCDIR}/posixjmp.h sig.h unwind_prot.h variables.h arrayfunc.h conftypes.h
builtins/mapfile.o: pathnames.h
# libintl dependencies # libintl dependencies
builtins/bind.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h builtins/bind.o: ${topdir}/bashintl.h ${LIBINTL_H} $(BASHINCDIR)/gettext.h

123
NEWS
View File

@ -1,3 +1,120 @@
This is a terse description of the new features added to bash-4.1 since
the release of bash-4.0. As always, the manual page (doc/bash.1) is
the place to look for complete descriptions.
1. New Features in Bash
a. Here-documents within $(...) command substitutions may once more be
delimited by the closing right paren, instead of requiring a newline.
b. Bash's file status checks (executable, readable, etc.) now take file
system ACLs into account on file systems that support them.
c. Bash now passes environment variables with names that are not valid
shell variable names through into the environment passed to child
processes.
d. The `execute-unix-command' readline function now attempts to clear and
reuse the current line rather than move to a new one after the command
executes.
e. `printf -v' can now assign values to array indices.
f. New `complete -E' and `compopt -E' options that work on the "empty"
completion: completion attempted on an empty command line.
g. New complete/compgen/compopt -D option to define a `default' completion:
a completion to be invoked on command for which no completion has been
defined. If this function returns 124, programmable completion is
attempted again, allowing a user to dynamically build a set of completions
as completion is attempted by having the default completion function
install individual completion functions each time it is invoked.
h. When displaying associative arrays, subscripts are now quoted.
i. Changes to dabbrev-expand to make it more `emacs-like': no space appended
after matches, completions are not sorted, and most recent history entries
are presented first.
j. The [[ and (( commands are now subject to the setting of `set -e' and the
ERR trap.
k. The source/. builtin now removes NUL bytes from the file before attempting
to parse commands.
l. There is a new configuration option (in config-top.h) that forces bash to
forward all history entries to syslog.
m. A new variable $BASHOPTS to export shell options settable using `shopt' to
child processes.
n. There is a new confgure option that forces the extglob option to be
enabled by default.
o. New variable $BASH_XTRACEFD; when set to an integer bash will write xtrace
output to that file descriptor.
p. If the optional left-hand-side of a redirection is of the form {var}, the
shell assigns the file descriptor used to $var or uses $var as the file
descriptor to move or close, depending on the redirection operator.
q. The < and > operators to the [[ conditional command now do string
comparison according to the current locale if the compatibility level
is greater than 40.
r. Programmable completion now uses the completion for `b' instead of `a'
when completion is attempted on a line like: a $(b c.
s. Force extglob on temporarily when parsing the pattern argument to
the == and != operators to the [[ command, for compatibility.
t. Changed the behavior of interrupting the wait builtin when a SIGCHLD is
received and a trap on SIGCHLD is set to be Posix-mode only.
u. The read builtin has a new `-N nchars' option, which reads exactly NCHARS
characters, ignoring delimiters like newline.
v. The mapfile/readarray builtin no longer stores the commands it invokes via
callbacks in the history list.
w. There is a new `compat40' shopt option.
2. New Features in Readline
a. New bindable function: menu-complete-backward.
b. In the vi insertion keymap, C-n is now bound to menu-complete by default,
and C-p to menu-complete-backward.
c. When in vi command mode, repeatedly hitting ESC now does nothing, even
when ESC introduces a bound key sequence. This is closer to how
historical vi behaves.
d. New bindable function: skip-csi-sequence. Can be used as a default to
consume key sequences generated by keys like Home and End without having
to bind all keys.
e. New application-settable function: rl_filename_rewrite_hook. Can be used
to rewite or modify filenames read from the file system before they are
compared to the word to be completed.
f. New bindable variable: skip-completed-text, active when completing in the
middle of a word. If enabled, it means that characters in the completion
that match characters in the remainder of the word are "skipped" rather
than inserted into the line.
g. The pre-readline-6.0 version of menu completion is available as
"old-menu-complete" for users who do not like the readline-6.0 version.
h. New bindable variable: echo-control-characters. If enabled, and the
tty ECHOCTL bit is set, controls the echoing of characters corresponding
to keyboard-generated signals.
i. New bindable variable: enable-meta-key. Controls whether or not readline
sends the smm/rmm sequences if the terminal indicates it has a meta key
that enables eight-bit characters.
-------------------------------------------------------------------------------
This is a terse description of the new features added to bash-4.0 since This is a terse description of the new features added to bash-4.0 since
the release of bash-3.2. As always, the manual page (doc/bash.1) is the release of bash-3.2. As always, the manual page (doc/bash.1) is
the place to look for complete descriptions. the place to look for complete descriptions.
@ -1410,3 +1527,9 @@ e. There are new library functions and variables available to application
f. The NEWLINE character (^J) is now treated as a search terminator by the f. The NEWLINE character (^J) is now treated as a search terminator by the
incremental search functions. incremental search functions.
-------------------------------------------------------------------------------
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without any warranty.

6
NOTES
View File

@ -344,4 +344,8 @@ Platform-Specific Configuration and Operation Notes
Apple ships inadequate dynamic libreadline and libhistory "replacements" Apple ships inadequate dynamic libreadline and libhistory "replacements"
as standard libraries. as standard libraries.
20. If you're on a system like SGI Irix, and you get an error about not
being able to refer to a dynamic symbol
(ld: non-dynamic relocations refer to dynamic symbol PC), add
-DNEED_EXTERN_PC to the LOCAL_CFLAGS variable in lib/readline/Makefile.in
and rebuild.

4
POSIX
View File

@ -164,6 +164,10 @@ The following list is what's changed when `POSIX mode' is in effect:
42. The `ulimit' builtin uses a block size of 512 bytes for the `-c' 42. The `ulimit' builtin uses a block size of 512 bytes for the `-c'
and `-f' options. and `-f' options.
43. The arrival of `SIGCHLD' when a trap is set on `SIGCHLD' does not
interrupt the `wait' builtin and cause it to return immediately.
The trap command is run once for each child that exits.
There is other POSIX behavior that Bash does not implement by default There is other POSIX behavior that Bash does not implement by default
even when in POSIX mode. Specifically: even when in POSIX mode. Specifically:

11
README
View File

@ -1,7 +1,7 @@
Introduction Introduction
============ ============
This is GNU Bash, version 4.0. Bash is the GNU Project's Bourne This is GNU Bash, version 4.1. Bash is the GNU Project's Bourne
Again SHell, a complete implementation of the POSIX.2 shell spec, Again SHell, a complete implementation of the POSIX.2 shell spec,
but also with interactive command line editing, job control on but also with interactive command line editing, job control on
architectures that support it, csh-like features such as history architectures that support it, csh-like features such as history
@ -15,8 +15,8 @@ See the file POSIX for a discussion of how the Bash defaults differ
from the POSIX.2 spec and a description of the Bash `posix mode'. from the POSIX.2 spec and a description of the Bash `posix mode'.
There are some user-visible incompatibilities between this version There are some user-visible incompatibilities between this version
of Bash and previous widely-distributed versions, bash-2.05b and of Bash and previous widely-distributed versions, bash-3.2 and
bash-3.2. For details, see the file COMPAT. The NEWS file tersely bash-4.0. For details, see the file COMPAT. The NEWS file tersely
lists features that are new in this release. lists features that are new in this release.
Bash is free software, distributed under the terms of the [GNU] General Bash is free software, distributed under the terms of the [GNU] General
@ -89,3 +89,8 @@ Enjoy!
Chet Ramey Chet Ramey
chet.ramey@case.edu chet.ramey@case.edu
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without any warranty.

97
aclocal.m4 vendored
View File

@ -80,6 +80,9 @@ AC_CACHE_VAL(bash_cv_type_$1,
#if HAVE_INTTYPES_H #if HAVE_INTTYPES_H
#include <inttypes.h> #include <inttypes.h>
#endif #endif
#if HAVE_STDINT_H
#include <stdint.h>
#endif
$2 $2
], bash_cv_type_$1=yes, bash_cv_type_$1=no)]) ], bash_cv_type_$1=yes, bash_cv_type_$1=no)])
AC_MSG_RESULT($bash_cv_type_$1) AC_MSG_RESULT($bash_cv_type_$1)
@ -1690,9 +1693,12 @@ AC_CHECK_HEADERS(wchar.h)
AC_CHECK_HEADERS(langinfo.h) AC_CHECK_HEADERS(langinfo.h)
AC_CHECK_FUNC(mbrlen, AC_DEFINE(HAVE_MBRLEN)) AC_CHECK_FUNC(mbrlen, AC_DEFINE(HAVE_MBRLEN))
AC_CHECK_FUNC(mbscasecmp, AC_DEFINE(HAVE_MBSCMP))
AC_CHECK_FUNC(mbscmp, AC_DEFINE(HAVE_MBSCMP)) AC_CHECK_FUNC(mbscmp, AC_DEFINE(HAVE_MBSCMP))
AC_CHECK_FUNC(mbsrtowcs, AC_DEFINE(HAVE_MBSRTOWCS)) AC_CHECK_FUNC(mbsrtowcs, AC_DEFINE(HAVE_MBSRTOWCS))
AC_REPLACE_FUNCS(mbschr)
AC_CHECK_FUNC(wcrtomb, AC_DEFINE(HAVE_WCRTOMB)) AC_CHECK_FUNC(wcrtomb, AC_DEFINE(HAVE_WCRTOMB))
AC_CHECK_FUNC(wcscoll, AC_DEFINE(HAVE_WCSCOLL)) AC_CHECK_FUNC(wcscoll, AC_DEFINE(HAVE_WCSCOLL))
AC_CHECK_FUNC(wcsdup, AC_DEFINE(HAVE_WCSDUP)) AC_CHECK_FUNC(wcsdup, AC_DEFINE(HAVE_WCSDUP))
@ -1753,6 +1759,13 @@ if test $bash_cv_type_wint_t = yes; then
AC_DEFINE(HAVE_WINT_T, 1, [systems should define this type here]) AC_DEFINE(HAVE_WINT_T, 1, [systems should define this type here])
fi fi
if test "$am_cv_func_iconv" = yes; then
OLDLIBS="$LIBS"
LIBS="$LIBS $LIBICONV"
AC_CHECK_FUNCS(locale_charset)
LIBS="$OLDLIBS"
fi
]) ])
dnl need: prefix exec_prefix libdir includedir CC TERMCAP_LIB dnl need: prefix exec_prefix libdir includedir CC TERMCAP_LIB
@ -4018,3 +4031,87 @@ AC_DEFUN([BASH_FUNC_FPURGE],
AC_CHECK_FUNCS_ONCE([__fpurge]) AC_CHECK_FUNCS_ONCE([__fpurge])
AC_CHECK_DECLS([fpurge], , , [#include <stdio.h>]) AC_CHECK_DECLS([fpurge], , , [#include <stdio.h>])
]) ])
AC_DEFUN([BASH_FUNC_SNPRINTF],
[
AC_CHECK_FUNCS_ONCE([snprintf])
if test X$ac_cv_func_snprintf = Xyes; then
AC_CACHE_CHECK([for standard-conformant snprintf], [bash_cv_func_snprintf],
[AC_TRY_RUN([
#include <stdio.h>
main()
{
int n;
n = snprintf (0, 0, "%s", "0123456");
exit(n != 7);
}
], bash_cv_func_snprintf=yes, bash_cv_func_snprintf=no,
[AC_MSG_WARN([cannot check standard snprintf if cross-compiling])
bash_cv_func_snprintf=yes]
)])
if test $bash_cv_func_snprintf = no; then
ac_cv_func_snprintf=no
fi
fi
if test $ac_cv_func_snprintf = no; then
AC_DEFINE(HAVE_SNPRINTF, 0,
[Define if you have a standard-conformant snprintf function.])
fi
])
AC_DEFUN([BASH_FUNC_VSNPRINTF],
[
AC_CHECK_FUNCS_ONCE([vsnprintf])
if test X$ac_cv_func_vsnprintf = Xyes; then
AC_CACHE_CHECK([for standard-conformant vsnprintf], [bash_cv_func_vsnprintf],
[AC_TRY_RUN([
#if HAVE_STDARG_H
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#include <stdio.h>
#include <stdlib.h>
static int
#if HAVE_STDARG_H
foo(const char *fmt, ...)
#else
foo(format, va_alist)
const char *format;
va_dcl
#endif
{
va_list args;
int n;
#if HAVE_STDARG_H
va_start(args, fmt);
#else
va_start(args);
#endif
n = vsnprintf(0, 0, fmt, args);
va_end (args);
return n;
}
main()
{
int n;
n = foo("%s", "0123456");
exit(n != 7);
}
], bash_cv_func_vsnprintf=yes, bash_cv_func_vsnprintf=no,
[AC_MSG_WARN([cannot check standard vsnprintf if cross-compiling])
bash_cv_func_vsnprintf=yes]
)])
if test $bash_cv_func_vsnprintf = no; then
ac_cv_func_vsnprintf=no
fi
fi
if test $ac_cv_func_vsnprintf = no; then
AC_DEFINE(HAVE_VSNPRINTF, 0,
[Define if you have a standard-conformant vsnprintf function.])
fi
])

View File

@ -526,7 +526,7 @@ alias_expand (string)
/* If there is a backslash-escaped character quoted in TOKEN, /* If there is a backslash-escaped character quoted in TOKEN,
then we don't do alias expansion. This should check for all then we don't do alias expansion. This should check for all
other quoting characters, too. */ other quoting characters, too. */
if (xstrchr (token, '\\')) if (mbschr (token, '\\'))
expand_this_token = 0; expand_this_token = 0;
/* If we should be expanding here, if we are expanding all words, or if /* If we should be expanding here, if we are expanding all words, or if

53
array.c
View File

@ -55,6 +55,31 @@
static char *array_to_string_internal __P((ARRAY_ELEMENT *, ARRAY_ELEMENT *, char *, int)); static char *array_to_string_internal __P((ARRAY_ELEMENT *, ARRAY_ELEMENT *, char *, int));
static ARRAY *lastarray = 0;
static ARRAY_ELEMENT *lastref = 0;
#define IS_LASTREF(a) ((a) == lastarray)
#define INVALIDATE_LASTREF(a) \
do { \
if ((a) == lastarray) { \
lastarray = 0; \
lastref = 0; \
} \
} while (0)
#define SET_LASTREF(a, e) \
do { \
lastarray = (a); \
lastref = (e); \
} while (0)
#define UNSET_LASTREF() \
do { \
lastarray = 0; \
lastref = 0; \
} while (0)
ARRAY * ARRAY *
array_create() array_create()
{ {
@ -87,6 +112,7 @@ ARRAY *a;
a->head->next = a->head->prev = a->head; a->head->next = a->head->prev = a->head;
a->max_index = -1; a->max_index = -1;
a->num_elements = 0; a->num_elements = 0;
INVALIDATE_LASTREF(a);
} }
void void
@ -185,6 +211,7 @@ int n, flags;
if (a == 0 || array_empty(a) || n <= 0) if (a == 0 || array_empty(a) || n <= 0)
return ((ARRAY_ELEMENT *)NULL); return ((ARRAY_ELEMENT *)NULL);
INVALIDATE_LASTREF(a);
for (i = 0, ret = ae = element_forw(a->head); ae != a->head && i < n; ae = element_forw(ae), i++) for (i = 0, ret = ae = element_forw(a->head); ae != a->head && i < n; ae = element_forw(ae), i++)
; ;
if (ae == a->head) { if (ae == a->head) {
@ -214,7 +241,7 @@ int n, flags;
element_index(ae) -= n; /* renumber retained indices */ element_index(ae) -= n; /* renumber retained indices */
a->num_elements -= n; /* modify bookkeeping information */ a->num_elements -= n; /* modify bookkeeping information */
a->max_index -= n; a->max_index = element_index(a->head->prev);
if (flags & AS_DISPOSE) { if (flags & AS_DISPOSE) {
for (ae = ret; ae; ) { for (ae = ret; ae; ) {
@ -251,8 +278,10 @@ char *s;
new = array_create_element(0, s); new = array_create_element(0, s);
ADD_BEFORE(ae, new); ADD_BEFORE(ae, new);
a->num_elements++; a->num_elements++;
if (array_num_elements(a) == 1) /* array was empty */ if (array_num_elements(a) == 1) { /* array was empty */
a->max_index = 0;
return 1; return 1;
}
} }
/* /*
@ -263,6 +292,7 @@ char *s;
a->max_index = element_index(a->head->prev); a->max_index = element_index(a->head->prev);
INVALIDATE_LASTREF(a);
return (a->num_elements); return (a->num_elements);
} }
@ -594,6 +624,7 @@ char *v;
ADD_BEFORE(a->head, new); ADD_BEFORE(a->head, new);
a->max_index = i; a->max_index = i;
a->num_elements++; a->num_elements++;
SET_LASTREF(a, new);
return(0); return(0);
} }
/* /*
@ -607,13 +638,16 @@ char *v;
array_dispose_element(new); array_dispose_element(new);
free(element_value(ae)); free(element_value(ae));
ae->value = v ? savestring(v) : (char *)NULL; ae->value = v ? savestring(v) : (char *)NULL;
SET_LASTREF(a, ae);
return(0); return(0);
} else if (element_index(ae) > i) { } else if (element_index(ae) > i) {
ADD_BEFORE(ae, new); ADD_BEFORE(ae, new);
a->num_elements++; a->num_elements++;
SET_LASTREF(a, new);
return(0); return(0);
} }
} }
INVALIDATE_LASTREF(a);
return (-1); /* problem */ return (-1); /* problem */
} }
@ -637,6 +671,7 @@ arrayind_t i;
a->num_elements--; a->num_elements--;
if (i == array_max_index(a)) if (i == array_max_index(a))
a->max_index = element_index(ae->prev); a->max_index = element_index(ae->prev);
INVALIDATE_LASTREF(a);
return(ae); return(ae);
} }
return((ARRAY_ELEMENT *) NULL); return((ARRAY_ELEMENT *) NULL);
@ -654,9 +689,19 @@ arrayind_t i;
if (a == 0 || array_empty(a)) if (a == 0 || array_empty(a))
return((char *) NULL); return((char *) NULL);
for (ae = element_forw(a->head); ae != a->head; ae = element_forw(ae)) if (i > array_max_index(a))
if (element_index(ae) == i) return((char *)NULL);
/* Keep roving pointer into array to optimize sequential access */
if (lastref && IS_LASTREF(a))
ae = (i >= element_index(lastref)) ? lastref : element_forw(a->head);
else
ae = element_forw(a->head);
for ( ; ae != a->head; ae = element_forw(ae))
if (element_index(ae) == i) {
SET_LASTREF(a, ae);
return(element_value(ae)); return(element_value(ae));
}
UNSET_LASTREF();
return((char *) NULL); return((char *) NULL);
} }

View File

@ -31,7 +31,8 @@ enum atype {array_indexed, array_assoc};
typedef struct array { typedef struct array {
enum atype type; enum atype type;
arrayind_t max_index, num_elements; arrayind_t max_index;
int num_elements;
struct array_element *head; struct array_element *head;
} ARRAY; } ARRAY;

View File

@ -407,6 +407,7 @@ expand_compound_array_assignment (var, value, flags)
return nlist; return nlist;
} }
/* Callers ensure that VAR is not NULL */
void void
assign_compound_array_list (var, nlist, flags) assign_compound_array_list (var, nlist, flags)
SHELL_VAR *var; SHELL_VAR *var;
@ -431,9 +432,9 @@ assign_compound_array_list (var, nlist, flags)
value. */ value. */
if ((flags & ASS_APPEND) == 0) if ((flags & ASS_APPEND) == 0)
{ {
if (array_p (var) && a) if (a && array_p (var))
array_flush (a); array_flush (a);
else if (assoc_p (var) && h) else if (h && assoc_p (var))
assoc_flush (h); assoc_flush (h);
} }
@ -447,7 +448,7 @@ assign_compound_array_list (var, nlist, flags)
/* We have a word of the form [ind]=value */ /* We have a word of the form [ind]=value */
if ((list->word->flags & W_ASSIGNMENT) && w[0] == '[') if ((list->word->flags & W_ASSIGNMENT) && w[0] == '[')
{ {
len = skipsubscript (w, 0); len = skipsubscript (w, 0, (var && assoc_p (var) != 0));
/* XXX - changes for `+=' */ /* XXX - changes for `+=' */
if (w[len] != ']' || (w[len+1] != '=' && (w[len+1] != '+' || w[len+2] != '='))) if (w[len] != ']' || (w[len+1] != '=' && (w[len+1] != '+' || w[len+2] != '=')))
@ -560,8 +561,9 @@ quote_assign (string)
{ {
size_t slen; size_t slen;
int saw_eq; int saw_eq;
char *temp, *t; char *temp, *t, *subs;
const char *s, *send; const char *s, *send;
int ss, se;
DECLARE_MBSTATE; DECLARE_MBSTATE;
slen = strlen (string); slen = strlen (string);
@ -573,6 +575,20 @@ quote_assign (string)
{ {
if (*s == '=') if (*s == '=')
saw_eq = 1; saw_eq = 1;
if (saw_eq == 0 && *s == '[') /* looks like a subscript */
{
ss = s - string;
se = skipsubscript (string, ss, 0);
subs = substring (s, ss, se);
*t++ = '\\';
strcpy (t, subs);
t += se - ss;
*t++ = '\\';
*t++ = ']';
s += se + 1;
free (subs);
continue;
}
if (saw_eq == 0 && (glob_char_p (s) || isifs (*s))) if (saw_eq == 0 && (glob_char_p (s) || isifs (*s)))
*t++ = '\\'; *t++ = '\\';
@ -596,7 +612,7 @@ quote_array_assignment_chars (list)
if (l->word == 0 || l->word->word == 0 || l->word->word[0] == '\0') if (l->word == 0 || l->word->word == 0 || l->word->word[0] == '\0')
continue; /* should not happen, but just in case... */ continue; /* should not happen, but just in case... */
/* Don't bother if it doesn't look like [ind]=value */ /* Don't bother if it doesn't look like [ind]=value */
if (l->word->word[0] != '[' || xstrchr (l->word->word, '=') == 0) /* ] */ if (l->word->word[0] != '[' || mbschr (l->word->word, '=') == 0) /* ] */
continue; continue;
nword = quote_assign (l->word->word); nword = quote_assign (l->word->word);
free (l->word->word); free (l->word->word);
@ -619,7 +635,7 @@ unbind_array_element (var, sub)
char *akey; char *akey;
ARRAY_ELEMENT *ae; ARRAY_ELEMENT *ae;
len = skipsubscript (sub, 0); len = skipsubscript (sub, 0, 0);
if (sub[len] != ']' || len == 0) if (sub[len] != ']' || len == 0)
{ {
builtin_error ("%s[%s: %s", var->name, sub, _(bash_badsub_errmsg)); builtin_error ("%s[%s: %s", var->name, sub, _(bash_badsub_errmsg));
@ -713,7 +729,7 @@ valid_array_reference (name)
char *t; char *t;
int r, len; int r, len;
t = xstrchr (name, '['); /* ] */ t = mbschr (name, '['); /* ] */
if (t) if (t)
{ {
*t = '\0'; *t = '\0';
@ -722,7 +738,7 @@ valid_array_reference (name)
if (r == 0) if (r == 0)
return 0; return 0;
/* Check for a properly-terminated non-blank subscript. */ /* Check for a properly-terminated non-blank subscript. */
len = skipsubscript (t, 0); len = skipsubscript (t, 0, 0);
if (t[len] != ']' || len == 1) if (t[len] != ']' || len == 1)
return 0; return 0;
for (r = 1; r < len; r++) for (r = 1; r < len; r++)
@ -773,7 +789,7 @@ array_variable_name (s, subp, lenp)
char *t, *ret; char *t, *ret;
int ind, ni; int ind, ni;
t = xstrchr (s, '['); t = mbschr (s, '[');
if (t == 0) if (t == 0)
{ {
if (subp) if (subp)
@ -783,7 +799,7 @@ array_variable_name (s, subp, lenp)
return ((char *)NULL); return ((char *)NULL);
} }
ind = t - s; ind = t - s;
ni = skipsubscript (s, ind); ni = skipsubscript (s, ind, 0);
if (ni <= ind + 1 || s[ni] != ']') if (ni <= ind + 1 || s[ni] != ']')
{ {
err_badarraysub (s); err_badarraysub (s);

View File

@ -32,6 +32,8 @@ extern SHELL_VAR *bind_array_variable __P((char *, arrayind_t, char *, int));
extern SHELL_VAR *bind_array_element __P((SHELL_VAR *, arrayind_t, char *, int)); extern SHELL_VAR *bind_array_element __P((SHELL_VAR *, arrayind_t, char *, int));
extern SHELL_VAR *assign_array_element __P((char *, char *, int)); extern SHELL_VAR *assign_array_element __P((char *, char *, int));
extern SHELL_VAR *bind_assoc_variable __P((SHELL_VAR *, char *, char *, char *, int));
extern SHELL_VAR *find_or_make_array_variable __P((char *, int)); extern SHELL_VAR *find_or_make_array_variable __P((char *, int));
extern SHELL_VAR *assign_array_from_string __P((char *, char *, int)); extern SHELL_VAR *assign_array_from_string __P((char *, char *, int));
@ -42,7 +44,7 @@ extern void assign_compound_array_list __P((SHELL_VAR *, WORD_LIST *, int));
extern SHELL_VAR *assign_array_var_from_string __P((SHELL_VAR *, char *, int)); extern SHELL_VAR *assign_array_var_from_string __P((SHELL_VAR *, char *, int));
extern int unbind_array_element __P((SHELL_VAR *, char *)); extern int unbind_array_element __P((SHELL_VAR *, char *));
extern int skipsubscript __P((const char *, int)); extern int skipsubscript __P((const char *, int, int));
extern void print_array_assignment __P((SHELL_VAR *, int)); extern void print_array_assignment __P((SHELL_VAR *, int));
extern void print_assoc_assignment __P((SHELL_VAR *, int)); extern void print_assoc_assignment __P((SHELL_VAR *, int));

11
assoc.c
View File

@ -405,7 +405,14 @@ assoc_to_assign (hash, quoted)
for (i = 0; i < hash->nbuckets; i++) for (i = 0; i < hash->nbuckets; i++)
for (tlist = hash_items (i, hash); tlist; tlist = tlist->next) for (tlist = hash_items (i, hash); tlist; tlist = tlist->next)
{ {
#if 1
if (sh_contains_shell_metas (tlist->key))
istr = sh_double_quote (tlist->key);
else
istr = tlist->key;
#else
istr = tlist->key; istr = tlist->key;
#endif
vstr = tlist->data ? sh_double_quote ((char *)tlist->data) : (char *)0; vstr = tlist->data ? sh_double_quote ((char *)tlist->data) : (char *)0;
elen = STRLEN (istr) + 8 + STRLEN (vstr); elen = STRLEN (istr) + 8 + STRLEN (vstr);
@ -423,6 +430,10 @@ assoc_to_assign (hash, quoted)
} }
ret[rlen++] = ' '; ret[rlen++] = ' ';
if (istr != tlist->key)
FREE (istr);
FREE (vstr); FREE (vstr);
} }

View File

@ -38,6 +38,10 @@
#include "bashintl.h" #include "bashintl.h"
#if defined (SYSLOG_HISTORY)
# include <syslog.h>
#endif
#include "shell.h" #include "shell.h"
#include "flags.h" #include "flags.h"
#include "input.h" #include "input.h"
@ -691,6 +695,26 @@ check_add_history (line, force)
return 0; return 0;
} }
#if defined (SYSLOG_HISTORY)
#define SYSLOG_MAXLEN 600
void
bash_syslog_history (line)
const char *line;
{
char trunc[SYSLOG_MAXLEN];
if (strlen(line) < SYSLOG_MAXLEN)
syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY: PID=%d UID=%d %s", getpid(), current_user.uid, line);
else
{
strncpy (trunc, line, SYSLOG_MAXLEN);
trunc[SYSLOG_MAXLEN - 1] = '\0';
syslog (SYSLOG_FACILITY|SYSLOG_LEVEL, "HISTORY (TRUNCATED): PID=%d UID=%d %s", getpid(), current_user.uid, trunc);
}
}
#endif
/* Add a line to the history list. /* Add a line to the history list.
The variable COMMAND_ORIENTED_HISTORY controls the style of history The variable COMMAND_ORIENTED_HISTORY controls the style of history
remembering; when non-zero, and LINE is not the first line of a remembering; when non-zero, and LINE is not the first line of a
@ -746,6 +770,10 @@ bash_add_history (line)
if (add_it) if (add_it)
really_add_history (line); really_add_history (line);
#if defined (SYSLOG_HISTORY)
bash_syslog_history (line);
#endif
using_history (); using_history ();
} }

View File

@ -82,6 +82,9 @@
extern int bash_brace_completion __P((int, int)); extern int bash_brace_completion __P((int, int));
#endif /* BRACE_COMPLETION */ #endif /* BRACE_COMPLETION */
/* To avoid including curses.h/term.h/termcap.h and that whole mess. */
extern int tputs __P((const char *string, int nlines, int (*outx)(int)));
/* Forward declarations */ /* Forward declarations */
/* Functions bound to keys in Readline for Bash users. */ /* Functions bound to keys in Readline for Bash users. */
@ -112,6 +115,7 @@ static int bash_backward_kill_shellword __P((int, int));
/* Helper functions for Readline. */ /* Helper functions for Readline. */
static char *restore_tilde __P((char *, char *)); static char *restore_tilde __P((char *, char *));
static char *bash_filename_rewrite_hook __P((char *, int));
static void bash_directory_expansion __P((char **)); static void bash_directory_expansion __P((char **));
static int bash_directory_completion_hook __P((char **)); static int bash_directory_completion_hook __P((char **));
static int filename_completion_ignore __P((char **)); static int filename_completion_ignore __P((char **));
@ -146,6 +150,7 @@ static char *bash_dequote_filename __P((char *, int));
static char *quote_word_break_chars __P((char *)); static char *quote_word_break_chars __P((char *));
static char *bash_quote_filename __P((char *, int, char *)); static char *bash_quote_filename __P((char *, int, char *));
static int putx __P((int));
static int bash_execute_unix_command __P((int, int)); static int bash_execute_unix_command __P((int, int));
static void init_unix_command_map __P((void)); static void init_unix_command_map __P((void));
static int isolate_sequence __P((char *, int, int, int *)); static int isolate_sequence __P((char *, int, int, int *));
@ -245,6 +250,9 @@ static rl_hook_func_t *old_rl_startup_hook = (rl_hook_func_t *)NULL;
static int dot_in_path = 0; static int dot_in_path = 0;
/* Set to non-zero when dabbrev-expand is running */
static int dabbrev_expand_active = 0;
/* What kind of quoting is performed by bash_quote_filename: /* What kind of quoting is performed by bash_quote_filename:
COMPLETE_DQUOTE = double-quoting the filename COMPLETE_DQUOTE = double-quoting the filename
COMPLETE_SQUOTE = single_quoting the filename COMPLETE_SQUOTE = single_quoting the filename
@ -494,6 +502,8 @@ initialize_readline ()
do other expansion on directory names. */ do other expansion on directory names. */
rl_directory_completion_hook = bash_directory_completion_hook; rl_directory_completion_hook = bash_directory_completion_hook;
rl_filename_rewrite_hook = bash_filename_rewrite_hook;
/* Tell the filename completer we want a chance to ignore some names. */ /* Tell the filename completer we want a chance to ignore some names. */
rl_ignore_some_completions_function = filename_completion_ignore; rl_ignore_some_completions_function = filename_completion_ignore;
@ -748,7 +758,7 @@ clear_hostname_list ()
return; return;
for (i = 0; i < hostname_list_length; i++) for (i = 0; i < hostname_list_length; i++)
free (hostname_list[i]); free (hostname_list[i]);
hostname_list_length = 0; hostname_list_length = hostname_list_initialized = 0;
} }
/* Return a NULL terminated list of hostnames which begin with TEXT. /* Return a NULL terminated list of hostnames which begin with TEXT.
@ -1187,7 +1197,7 @@ find_cmd_start (start)
register int s, os; register int s, os;
os = 0; os = 0;
while (((s = skip_to_delim (rl_line_buffer, os, COMMAND_SEPARATORS, SD_NOJMP)) <= start) && while (((s = skip_to_delim (rl_line_buffer, os, COMMAND_SEPARATORS, SD_NOJMP|SD_NOSKIPCMD)) <= start) &&
rl_line_buffer[s]) rl_line_buffer[s])
os = s+1; os = s+1;
return os; return os;
@ -1305,8 +1315,9 @@ attempt_shell_completion (text, start, end)
/* Special handling for command substitution. If *TEXT is a backquote, /* Special handling for command substitution. If *TEXT is a backquote,
it can be the start or end of an old-style command substitution, or it can be the start or end of an old-style command substitution, or
unmatched. If it's unmatched, both calls to unclosed_pair will unmatched. If it's unmatched, both calls to unclosed_pair will
succeed. */ succeed. Don't bother if readline found a single quote and we are
if (*text == '`' && completing on the substring. */
if (*text == '`' && rl_completion_quote_character != '\'' &&
(in_command_position || (unclosed_pair (rl_line_buffer, start, "`") && (in_command_position || (unclosed_pair (rl_line_buffer, start, "`") &&
unclosed_pair (rl_line_buffer, end, "`")))) unclosed_pair (rl_line_buffer, end, "`"))))
matches = rl_completion_matches (text, command_subst_completion_function); matches = rl_completion_matches (text, command_subst_completion_function);
@ -1386,7 +1397,7 @@ bash_default_completion (text, start, end, qc, compflags)
/* If the word starts in `~', and there is no slash in the word, then /* If the word starts in `~', and there is no slash in the word, then
try completing this word as a username. */ try completing this word as a username. */
if (!matches && *text == '~' && !xstrchr (text, '/')) if (matches ==0 && *text == '~' && mbschr (text, '/') == 0)
matches = rl_completion_matches (text, rl_username_completion_function); matches = rl_completion_matches (text, rl_username_completion_function);
/* Another one. Why not? If the word starts in '@', then look through /* Another one. Why not? If the word starts in '@', then look through
@ -2652,6 +2663,20 @@ bash_directory_expansion (dirname)
} }
} }
/* If necessary, rewrite directory entry */
static char *
bash_filename_rewrite_hook (fname, fnlen)
char *fname;
int fnlen;
{
char *conv;
conv = fnx_fromfs (fname, fnlen);
if (conv != fname)
conv = savestring (conv);
return conv;
}
/* Handle symbolic link references and other directory name /* Handle symbolic link references and other directory name
expansions while hacking completion. */ expansions while hacking completion. */
static int static int
@ -2666,11 +2691,11 @@ bash_directory_completion_hook (dirname)
return_value = should_expand_dirname = 0; return_value = should_expand_dirname = 0;
local_dirname = *dirname; local_dirname = *dirname;
if (xstrchr (local_dirname, '$')) if (mbschr (local_dirname, '$'))
should_expand_dirname = 1; should_expand_dirname = 1;
else else
{ {
t = xstrchr (local_dirname, '`'); t = mbschr (local_dirname, '`');
if (t && unclosed_pair (local_dirname, strlen (local_dirname), "`") == 0) if (t && unclosed_pair (local_dirname, strlen (local_dirname), "`") == 0)
should_expand_dirname = 1; should_expand_dirname = 1;
} }
@ -2787,6 +2812,8 @@ build_history_completion_array ()
if (hlist) if (hlist)
{ {
for (i = 0; hlist[i]; i++) for (i = 0; hlist[i]; i++)
;
for ( --i; i >= 0; i--)
{ {
/* Separate each token, and place into an array. */ /* Separate each token, and place into an array. */
tokens = history_tokenize (hlist[i]->line); tokens = history_tokenize (hlist[i]->line);
@ -2803,7 +2830,8 @@ build_history_completion_array ()
} }
/* Sort the complete list of tokens. */ /* Sort the complete list of tokens. */
qsort (history_completion_array, harry_len, sizeof (char *), (QSFUNC *)strvec_strcmp); if (dabbrev_expand_active == 0)
qsort (history_completion_array, harry_len, sizeof (char *), (QSFUNC *)strvec_strcmp);
} }
} }
@ -2819,6 +2847,8 @@ history_completion_generator (hint_text, state)
list of strings to complete over. */ list of strings to complete over. */
if (state == 0) if (state == 0)
{ {
if (dabbrev_expand_active) /* This is kind of messy */
rl_completion_suppress_append = 1;
local_index = 0; local_index = 0;
build_history_completion_array (); build_history_completion_array ();
text = hint_text; text = hint_text;
@ -2862,25 +2892,33 @@ static int
bash_dabbrev_expand (count, key) bash_dabbrev_expand (count, key)
int count, key; int count, key;
{ {
int r; int r, orig_suppress, orig_sort;
rl_compentry_func_t *orig_func; rl_compentry_func_t *orig_func;
rl_completion_func_t *orig_attempt_func; rl_completion_func_t *orig_attempt_func;
orig_func = rl_menu_completion_entry_function; orig_func = rl_menu_completion_entry_function;
orig_attempt_func = rl_attempted_completion_function; orig_attempt_func = rl_attempted_completion_function;
orig_suppress = rl_completion_suppress_append;
orig_sort = rl_sort_completion_matches;
rl_menu_completion_entry_function = history_completion_generator; rl_menu_completion_entry_function = history_completion_generator;
rl_attempted_completion_function = (rl_completion_func_t *)NULL; rl_attempted_completion_function = (rl_completion_func_t *)NULL;
rl_filename_completion_desired = 0; rl_filename_completion_desired = 0;
rl_completion_suppress_append = 1;
rl_sort_completion_matches = 0;
/* XXX - use rl_completion_mode here? */ /* XXX - use rl_completion_mode here? */
dabbrev_expand_active = 1;
if (rl_last_func == bash_dabbrev_expand) if (rl_last_func == bash_dabbrev_expand)
rl_last_func = rl_menu_complete; rl_last_func = rl_menu_complete;
r = rl_menu_complete (count, key); r = rl_menu_complete (count, key);
dabbrev_expand_active = 0;
rl_last_func = bash_dabbrev_expand; rl_last_func = bash_dabbrev_expand;
rl_menu_completion_entry_function = orig_func; rl_menu_completion_entry_function = orig_func;
rl_attempted_completion_function = orig_attempt_func; rl_attempted_completion_function = orig_attempt_func;
rl_completion_suppress_append = orig_suppress;
rl_sort_completion_matches = orig_sort;
return r; return r;
} }
@ -3225,7 +3263,7 @@ bash_dequote_filename (text, quote_char)
*r++ = *++p; *r++ = *++p;
if (*p == '\0') if (*p == '\0')
break; return ret; /* XXX - was break; */
continue; continue;
} }
/* Close quote. */ /* Close quote. */
@ -3271,7 +3309,7 @@ quote_word_break_chars (text)
} }
/* OK, we have an unquoted character. Check its presence in /* OK, we have an unquoted character. Check its presence in
rl_completer_word_break_characters. */ rl_completer_word_break_characters. */
if (xstrchr (rl_completer_word_break_characters, *s)) if (mbschr (rl_completer_word_break_characters, *s))
*r++ = '\\'; *r++ = '\\';
/* XXX -- check for standalone tildes here and backslash-quote them */ /* XXX -- check for standalone tildes here and backslash-quote them */
if (s == text && *s == '~' && file_exists (text)) if (s == text && *s == '~' && file_exists (text))
@ -3313,7 +3351,7 @@ bash_quote_filename (s, rtype, qcp)
the word being completed contains newlines, since those are not the word being completed contains newlines, since those are not
quoted correctly using backslashes (a backslash-newline pair is quoted correctly using backslashes (a backslash-newline pair is
special to the shell parser). */ special to the shell parser). */
if (*qcp == '\0' && cs == COMPLETE_BSQUOTE && xstrchr (s, '\n')) if (*qcp == '\0' && cs == COMPLETE_BSQUOTE && mbschr (s, '\n'))
cs = COMPLETE_SQUOTE; cs = COMPLETE_SQUOTE;
else if (*qcp == '"') else if (*qcp == '"')
cs = COMPLETE_DQUOTE; cs = COMPLETE_DQUOTE;
@ -3321,11 +3359,11 @@ bash_quote_filename (s, rtype, qcp)
cs = COMPLETE_SQUOTE; cs = COMPLETE_SQUOTE;
#if defined (BANG_HISTORY) #if defined (BANG_HISTORY)
else if (*qcp == '\0' && history_expansion && cs == COMPLETE_DQUOTE && else if (*qcp == '\0' && history_expansion && cs == COMPLETE_DQUOTE &&
history_expansion_inhibited == 0 && xstrchr (s, '!')) history_expansion_inhibited == 0 && mbschr (s, '!'))
cs = COMPLETE_BSQUOTE; cs = COMPLETE_BSQUOTE;
if (*qcp == '"' && history_expansion && cs == COMPLETE_DQUOTE && if (*qcp == '"' && history_expansion && cs == COMPLETE_DQUOTE &&
history_expansion_inhibited == 0 && xstrchr (s, '!')) history_expansion_inhibited == 0 && mbschr (s, '!'))
{ {
cs = COMPLETE_BSQUOTE; cs = COMPLETE_BSQUOTE;
*qcp = '\0'; *qcp = '\0';
@ -3379,6 +3417,13 @@ bash_quote_filename (s, rtype, qcp)
/* Support for binding readline key sequences to Unix commands. */ /* Support for binding readline key sequences to Unix commands. */
static Keymap cmd_xmap; static Keymap cmd_xmap;
static int
putx(c)
int c;
{
putc (c, rl_outstream);
}
static int static int
bash_execute_unix_command (count, key) bash_execute_unix_command (count, key)
int count; /* ignored */ int count; /* ignored */
@ -3386,10 +3431,10 @@ bash_execute_unix_command (count, key)
{ {
Keymap ckmap; /* current keymap */ Keymap ckmap; /* current keymap */
Keymap xkmap; /* unix command executing keymap */ Keymap xkmap; /* unix command executing keymap */
register int i; register int i, r;
intmax_t mi; intmax_t mi;
sh_parser_state_t ps; sh_parser_state_t ps;
char *cmd, *value, *l; char *cmd, *value, *l, *l1, *ce;
SHELL_VAR *v; SHELL_VAR *v;
char ibuf[INT_STRLEN_BOUND(int) + 1]; char ibuf[INT_STRLEN_BOUND(int) + 1];
@ -3425,12 +3470,20 @@ bash_execute_unix_command (count, key)
return 1; return 1;
} }
rl_crlf (); /* move to a new line */ ce = rl_get_termcap ("ce");
if (ce) /* clear current line */
{
fprintf (rl_outstream, "\r");
tputs (ce, 1, putx);
fflush (rl_outstream);
}
else
rl_crlf (); /* move to a new line */
v = bind_variable ("READLINE_LINE", rl_line_buffer, 0); v = bind_variable ("READLINE_LINE", rl_line_buffer, 0);
if (v) if (v)
VSETATTR (v, att_exported); VSETATTR (v, att_exported);
l = value_cell (v); l = v ? value_cell (v) : 0;
value = inttostr (rl_point, ibuf, sizeof (ibuf)); value = inttostr (rl_point, ibuf, sizeof (ibuf));
v = bind_int_variable ("READLINE_POINT", value); v = bind_int_variable ("READLINE_POINT", value);
if (v) if (v)
@ -3438,11 +3491,12 @@ bash_execute_unix_command (count, key)
array_needs_making = 1; array_needs_making = 1;
save_parser_state (&ps); save_parser_state (&ps);
parse_and_execute (cmd, "bash_execute_unix_command", SEVAL_NOHIST|SEVAL_NOFREE); r = parse_and_execute (cmd, "bash_execute_unix_command", SEVAL_NOHIST|SEVAL_NOFREE);
restore_parser_state (&ps); restore_parser_state (&ps);
v = find_variable ("READLINE_LINE"); v = find_variable ("READLINE_LINE");
if (value_cell (v) != l) l1 = v ? value_cell (v) : 0;
if (l1 != l)
maybe_make_readline_line (value_cell (v)); maybe_make_readline_line (value_cell (v));
v = find_variable ("READLINE_POINT"); v = find_variable ("READLINE_POINT");
if (v && legal_number (value_cell (v), &mi)) if (v && legal_number (value_cell (v), &mi))

View File

@ -35,4 +35,8 @@
# include <inttypes.h> # include <inttypes.h>
#endif #endif
#if HAVE_STDINT_H
# include <stdint.h>
#endif
#endif /* _BASHTYPES_H_ */ #endif /* _BASHTYPES_H_ */

View File

@ -364,7 +364,7 @@ expand_seqterm (text, tlen)
char *t, *lhs, *rhs; char *t, *lhs, *rhs;
int i, lhs_t, rhs_t, lhs_v, rhs_v, incr, lhs_l, rhs_l, width; int i, lhs_t, rhs_t, lhs_v, rhs_v, incr, lhs_l, rhs_l, width;
intmax_t tl, tr; intmax_t tl, tr;
char **result, *ep; char **result, *ep, *oep;
t = strstr (text, BRACE_SEQ_SPECIFIER); t = strstr (text, BRACE_SEQ_SPECIFIER);
if (t == 0) if (t == 0)
@ -410,10 +410,12 @@ expand_seqterm (text, tlen)
incr = 1; incr = 1;
if (rhs_t != ST_BAD) if (rhs_t != ST_BAD)
{ {
oep = ep;
if (ep && *ep == '.' && ep[1] == '.' && ep[2]) if (ep && *ep == '.' && ep[1] == '.' && ep[2])
incr = strtoimax (ep + 2, &ep, 10); incr = strtoimax (ep + 2, &ep, 10);
if (*ep != 0) if (*ep != 0)
rhs_t = ST_BAD; /* invalid incr */ rhs_t = ST_BAD; /* invalid incr */
tlen -= ep - oep;
} }
if (lhs_t != rhs_t || lhs_t == ST_BAD || rhs_t == ST_BAD) if (lhs_t != rhs_t || lhs_t == ST_BAD || rhs_t == ST_BAD)
@ -449,6 +451,11 @@ expand_seqterm (text, tlen)
width = rhs_l, lhs_t = ST_ZINT; width = rhs_l, lhs_t = ST_ZINT;
if (rhs_l > 2 && rhs[0] == '-' && rhs[1] == '0' && width < rhs_l) if (rhs_l > 2 && rhs[0] == '-' && rhs[1] == '0' && width < rhs_l)
width = rhs_l, lhs_t = ST_ZINT; width = rhs_l, lhs_t = ST_ZINT;
if (width < lhs_l && lhs_t == ST_ZINT)
width = lhs_l;
if (width < rhs_l && lhs_t == ST_ZINT)
width = rhs_l;
} }
result = mkseq (lhs_v, rhs_v, incr, lhs_t, width); result = mkseq (lhs_v, rhs_v, incr, lhs_t, width);

View File

@ -333,7 +333,7 @@ evalstring.o: $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h $(topdir)/subst.h
evalstring.o: $(topdir)/externs.h $(topdir)/jobs.h $(topdir)/builtins.h evalstring.o: $(topdir)/externs.h $(topdir)/jobs.h $(topdir)/builtins.h
evalstring.o: $(topdir)/flags.h $(topdir)/input.h $(topdir)/execute_cmd.h evalstring.o: $(topdir)/flags.h $(topdir)/input.h $(topdir)/execute_cmd.h
evalstring.o: $(topdir)/bashhist.h $(srcdir)/common.h evalstring.o: $(topdir)/bashhist.h $(srcdir)/common.h
evalstring.o: $(topdir)/trap.h $(topdir)/redir.h evalstring.o: $(topdir)/trap.h $(topdir)/redir.h ../pathnames.h
getopt.o: ../config.h $(BASHINCDIR)/memalloc.h getopt.o: ../config.h $(BASHINCDIR)/memalloc.h
getopt.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/bashjmp.h $(topdir)/command.h getopt.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/bashjmp.h $(topdir)/command.h
getopt.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/error.h $(topdir)/variables.h $(topdir)/conftypes.h getopt.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/error.h $(topdir)/variables.h $(topdir)/conftypes.h
@ -351,63 +351,67 @@ alias.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h $(BASHINCDIR)
alias.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h alias.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
alias.o: $(topdir)/subst.h $(topdir)/externs.h $(srcdir)/common.h alias.o: $(topdir)/subst.h $(topdir)/externs.h $(srcdir)/common.h
alias.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h alias.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
alias.o: ../pathnames.h
bind.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/error.h bind.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/error.h
bind.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h bind.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
bind.o: $(topdir)/subst.h $(topdir)/externs.h $(srcdir)/bashgetopt.h bind.o: $(topdir)/subst.h $(topdir)/externs.h $(srcdir)/bashgetopt.h
bind.o: $(topdir)/general.h $(topdir)/xmalloc.h $(BASHINCDIR)/maxpath.h $(topdir)/bashline.h bind.o: $(topdir)/general.h $(topdir)/xmalloc.h $(BASHINCDIR)/maxpath.h $(topdir)/bashline.h
bind.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h bind.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
bind.o: ../pathnames.h
break.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h break.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
break.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h break.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
break.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h break.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
break.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h break.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
break.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h break.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
break.o: ../pathnames.h
builtin.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h builtin.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
builtin.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/externs.h builtin.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/externs.h
builtin.o: $(topdir)/quit.h $(srcdir)/common.h $(BASHINCDIR)/maxpath.h builtin.o: $(topdir)/quit.h $(srcdir)/common.h $(BASHINCDIR)/maxpath.h
builtin.o: $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h $(topdir)/subst.h builtin.o: $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h $(topdir)/subst.h
builtin.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h builtin.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
builtin.o: $(srcdir)/bashgetopt.h builtin.o: $(srcdir)/bashgetopt.h ../pathnames.h
caller.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/error.h caller.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/error.h
caller.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/quit.h $(topdir)/dispose_cmd.h caller.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/quit.h $(topdir)/dispose_cmd.h
caller.o: $(topdir)/make_cmd.h $(topdir)/subst.h $(topdir)/externs.h caller.o: $(topdir)/make_cmd.h $(topdir)/subst.h $(topdir)/externs.h
caller.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h caller.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
caller.o: $(srcdir)/common.h $(BASHINCDIR)/maxpath.h ./builtext.h caller.o: $(srcdir)/common.h $(BASHINCDIR)/maxpath.h ./builtext.h
caller.o: ${BASHINCDIR}/chartypes.h $(topdir)/bashtypes.h caller.o: ${BASHINCDIR}/chartypes.h $(topdir)/bashtypes.h ../pathnames.h
cd.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/error.h cd.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/error.h
cd.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/quit.h $(topdir)/dispose_cmd.h cd.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/quit.h $(topdir)/dispose_cmd.h
cd.o: $(topdir)/make_cmd.h $(topdir)/subst.h $(topdir)/externs.h cd.o: $(topdir)/make_cmd.h $(topdir)/subst.h $(topdir)/externs.h
cd.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h cd.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
cd.o: $(srcdir)/common.h $(BASHINCDIR)/maxpath.h cd.o: $(srcdir)/common.h $(BASHINCDIR)/maxpath.h ../pathnames.h
command.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h command.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
command.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/externs.h command.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/externs.h
command.o: $(topdir)/quit.h $(srcdir)/bashgetopt.h $(BASHINCDIR)/maxpath.h command.o: $(topdir)/quit.h $(srcdir)/bashgetopt.h $(BASHINCDIR)/maxpath.h
command.o: $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h $(topdir)/subst.h command.o: $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h $(topdir)/subst.h
command.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h command.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
command.o: ../pathnames.h
declare.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h declare.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
declare.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h declare.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
declare.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h declare.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
declare.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h declare.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
declare.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h declare.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
declare.o: $(topdir)/arrayfunc.h $(srcdir)/bashgetopt.h declare.o: $(topdir)/arrayfunc.h $(srcdir)/bashgetopt.h
declare.o: ./builtext.h declare.o: ./builtext.h ../pathnames.h
echo.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/error.h echo.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/error.h
echo.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/subst.h $(topdir)/externs.h echo.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/subst.h $(topdir)/externs.h
echo.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h echo.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
echo.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h echo.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
echo.o: $(BASHINCDIR)/maxpath.h echo.o: $(BASHINCDIR)/maxpath.h ../pathnames.h
enable.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h enable.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
enable.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h enable.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
enable.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h enable.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
enable.o: $(topdir)/subst.h $(topdir)/externs.h enable.o: $(topdir)/subst.h $(topdir)/externs.h
enable.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h enable.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
enable.o: $(BASHINCDIR)/maxpath.h enable.o: $(BASHINCDIR)/maxpath.h ../pathnames.h
enable.o: $(topdir)/pcomplete.h enable.o: $(topdir)/pcomplete.h
eval.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h eval.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
eval.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h eval.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
eval.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h eval.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
eval.o: $(topdir)/subst.h $(topdir)/externs.h eval.o: $(topdir)/subst.h $(topdir)/externs.h
eval.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h eval.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
eval.o: $(BASHINCDIR)/maxpath.h eval.o: $(BASHINCDIR)/maxpath.h ../pathnames.h
exec.o: $(topdir)/bashtypes.h exec.o: $(topdir)/bashtypes.h
exec.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h exec.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
exec.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h exec.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
@ -415,14 +419,14 @@ exec.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
exec.o: $(topdir)/subst.h $(topdir)/externs.h $(topdir)/flags.h exec.o: $(topdir)/subst.h $(topdir)/externs.h $(topdir)/flags.h
exec.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h exec.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
exec.o: $(srcdir)/common.h $(topdir)/execute_cmd.h $(BASHINCDIR)/maxpath.h exec.o: $(srcdir)/common.h $(topdir)/execute_cmd.h $(BASHINCDIR)/maxpath.h
exec.o: $(topdir)/findcmd.h $(topdir)/jobs.h exec.o: $(topdir)/findcmd.h $(topdir)/jobs.h ../pathnames.h
exit.o: $(topdir)/bashtypes.h exit.o: $(topdir)/bashtypes.h
exit.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h exit.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
exit.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h exit.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
exit.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h exit.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
exit.o: $(topdir)/subst.h $(topdir)/externs.h $(topdir)/jobs.h exit.o: $(topdir)/subst.h $(topdir)/externs.h $(topdir)/jobs.h
exit.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h exit.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
exit.o: $(BASHINCDIR)/maxpath.h ./builtext.h exit.o: $(BASHINCDIR)/maxpath.h ./builtext.h ../pathnames.h
fc.o: $(topdir)/bashtypes.h $(BASHINCDIR)/posixstat.h fc.o: $(topdir)/bashtypes.h $(BASHINCDIR)/posixstat.h
fc.o: $(topdir)/builtins.h $(topdir)/command.h $(srcdir)/bashgetopt.h fc.o: $(topdir)/builtins.h $(topdir)/command.h $(srcdir)/bashgetopt.h
fc.o: $(topdir)/bashhist.h fc.o: $(topdir)/bashhist.h
@ -432,30 +436,32 @@ fc.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
fc.o: $(topdir)/subst.h $(topdir)/externs.h $(topdir)/shell.h $(topdir)/syntax.h fc.o: $(topdir)/subst.h $(topdir)/externs.h $(topdir)/shell.h $(topdir)/syntax.h
fc.o: $(topdir)/flags.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h fc.o: $(topdir)/flags.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
fc.o: $(topdir)/bashansi.h $(BASHINCDIR)/ansi_stdlib.h $(BASHINCDIR)/chartypes.h fc.o: $(topdir)/bashansi.h $(BASHINCDIR)/ansi_stdlib.h $(BASHINCDIR)/chartypes.h
fc.o: ../pathnames.h
fg_bg.o: $(topdir)/bashtypes.h $(srcdir)/bashgetopt.h fg_bg.o: $(topdir)/bashtypes.h $(srcdir)/bashgetopt.h
fg_bg.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h fg_bg.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
fg_bg.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h fg_bg.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
fg_bg.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h fg_bg.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
fg_bg.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h fg_bg.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
fg_bg.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h fg_bg.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
fg_bg.o: $(topdir)/jobs.h fg_bg.o: $(topdir)/jobs.h ../pathnames.h
getopts.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h getopts.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
getopts.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h getopts.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
getopts.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h getopts.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
getopts.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h getopts.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
getopts.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h getopts.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
getopts.o: ../pathnames.h
hash.o: $(topdir)/builtins.h $(topdir)/command.h $(topdir)/quit.h hash.o: $(topdir)/builtins.h $(topdir)/command.h $(topdir)/quit.h
hash.o: $(topdir)/findcmd.h $(topdir)/hashlib.h hash.o: $(topdir)/findcmd.h $(topdir)/hashlib.h
hash.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h hash.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
hash.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h hash.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
hash.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h hash.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
hash.o: $(srcdir)/common.h $(BASHINCDIR)/maxpath.h hash.o: $(srcdir)/common.h $(BASHINCDIR)/maxpath.h ../pathnames.h
help.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h help.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
help.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h help.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
help.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h help.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
help.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h help.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
help.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h help.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
help.o: ${srcdir}/common.h help.o: ${srcdir}/common.h ../pathnames.h
history.o: $(topdir)/bashtypes.h history.o: $(topdir)/bashtypes.h
history.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h history.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
history.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h history.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
@ -463,27 +469,30 @@ history.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
history.o: $(topdir)/subst.h $(topdir)/externs.h history.o: $(topdir)/subst.h $(topdir)/externs.h
history.o: ${BASHINCDIR}/filecntl.h $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h history.o: ${BASHINCDIR}/filecntl.h $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h
history.o: $(topdir)/variables.h $(topdir)/conftypes.h $(topdir)/bashhist.h $(BASHINCDIR)/maxpath.h history.o: $(topdir)/variables.h $(topdir)/conftypes.h $(topdir)/bashhist.h $(BASHINCDIR)/maxpath.h
history.o: ../pathnames.h
inlib.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h inlib.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
inlib.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h inlib.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
inlib.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h inlib.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
inlib.o: $(BASHINCDIR)/maxpath.h $(topdir)/subst.h $(topdir)/externs.h inlib.o: $(BASHINCDIR)/maxpath.h $(topdir)/subst.h $(topdir)/externs.h
inlib.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h inlib.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h ../pathnames.h
jobs.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/error.h jobs.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/error.h
jobs.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/quit.h $(srcdir)/bashgetopt.h jobs.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/quit.h $(srcdir)/bashgetopt.h
jobs.o: $(BASHINCDIR)/maxpath.h $(topdir)/externs.h $(topdir)/jobs.h jobs.o: $(BASHINCDIR)/maxpath.h $(topdir)/externs.h $(topdir)/jobs.h
jobs.o: $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h $(topdir)/subst.h jobs.o: $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h $(topdir)/subst.h
jobs.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h jobs.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
jobs.o: ../pathnames.h
kill.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/error.h kill.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/error.h
kill.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/subst.h $(topdir)/externs.h kill.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/subst.h $(topdir)/externs.h
kill.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h kill.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
kill.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/trap.h $(topdir)/unwind_prot.h kill.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/trap.h $(topdir)/unwind_prot.h
kill.o: $(topdir)/variables.h $(topdir)/conftypes.h $(BASHINCDIR)/maxpath.h kill.o: $(topdir)/variables.h $(topdir)/conftypes.h $(BASHINCDIR)/maxpath.h
kill.o: $(topdir)/jobs.h kill.o: $(topdir)/jobs.h ../pathnames.h
let.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h let.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
let.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h let.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
let.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h let.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
let.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h let.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
let.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h let.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
let.o: ../pathnames.h
printf.o: ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/bashjmp.h printf.o: ../config.h $(BASHINCDIR)/memalloc.h $(topdir)/bashjmp.h
printf.o: $(topdir)/command.h $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h printf.o: $(topdir)/command.h $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
printf.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h printf.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
@ -491,104 +500,111 @@ printf.o: $(topdir)/subst.h $(topdir)/externs.h $(topdir)/sig.h
printf.o: ../pathnames.h $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h printf.o: ../pathnames.h $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h
printf.o: $(topdir)/variables.h $(topdir)/conftypes.h $(BASHINCDIR)/stdc.h $(srcdir)/bashgetopt.h printf.o: $(topdir)/variables.h $(topdir)/conftypes.h $(BASHINCDIR)/stdc.h $(srcdir)/bashgetopt.h
printf.o: $(topdir)/bashtypes.h ${srcdir}/common.h $(BASHINCDIR)/chartypes.h printf.o: $(topdir)/bashtypes.h ${srcdir}/common.h $(BASHINCDIR)/chartypes.h
printf.o: ../pathnames.h
pushd.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h pushd.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
pushd.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h pushd.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
pushd.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h pushd.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
pushd.o: $(topdir)/subst.h $(topdir)/externs.h pushd.o: $(topdir)/subst.h $(topdir)/externs.h
pushd.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h pushd.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
pushd.o: $(BASHINCDIR)/maxpath.h $(srcdir)/common.h ./builtext.h pushd.o: $(BASHINCDIR)/maxpath.h $(srcdir)/common.h ./builtext.h
pushd.o: ../pathnames.h
read.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h read.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
read.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h read.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
read.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h read.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
read.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h read.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
read.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h read.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
read.o: $(BASHINCDIR)/shtty.h read.o: $(BASHINCDIR)/shtty.h
read.o: $(topdir)/arrayfunc.h read.o: $(topdir)/arrayfunc.h ../pathnames.h
return.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h return.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
return.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h return.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
return.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h return.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
return.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h return.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
return.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h return.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
return.o: ../pathnames.h
set.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h set.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
set.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/subst.h $(topdir)/externs.h set.o: $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/subst.h $(topdir)/externs.h
set.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h set.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
set.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h set.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
set.o: $(BASHINCDIR)/maxpath.h $(topdir)/error.h set.o: $(BASHINCDIR)/maxpath.h $(topdir)/error.h
set.o: $(topdir)/arrayfunc.h set.o: $(topdir)/arrayfunc.h ../pathnames.h
setattr.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h setattr.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
setattr.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h $(BASHINCDIR)/maxpath.h setattr.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h $(BASHINCDIR)/maxpath.h
setattr.o: $(topdir)/quit.h $(srcdir)/common.h $(srcdir)/bashgetopt.h setattr.o: $(topdir)/quit.h $(srcdir)/common.h $(srcdir)/bashgetopt.h
setattr.o: $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h $(topdir)/subst.h setattr.o: $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h $(topdir)/subst.h
setattr.o: $(topdir)/externs.h setattr.o: $(topdir)/externs.h
setattr.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h setattr.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
setattr.o: $(topdir)/arrayfunc.h setattr.o: $(topdir)/arrayfunc.h ../pathnames.h
shift.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h shift.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
shift.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h shift.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
shift.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h shift.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
shift.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h shift.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
shift.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h shift.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
shift.o: ../pathnames.h
shopt.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
shopt.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
shopt.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
shopt.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
shopt.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
shopt.o: $(srcdir)/common.h $(srcdir)/bashgetopt.h ../pathnames.h
shopt.o: $(topdir)/bashhist.h
source.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h source.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
source.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/findcmd.h source.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/findcmd.h
source.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h source.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
source.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h source.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
source.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h source.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
source.o: $(srcdir)/bashgetopt.h $(topdir)/flags.h $(topdir)/trap.h source.o: $(srcdir)/bashgetopt.h $(topdir)/flags.h $(topdir)/trap.h
source.o: ../pathnames.h
suspend.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h suspend.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
suspend.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h suspend.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
suspend.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h suspend.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
suspend.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h suspend.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
suspend.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h suspend.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
suspend.o: $(topdir)/jobs.h suspend.o: $(topdir)/jobs.h ../pathnames.h
test.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h test.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
test.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h test.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
test.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h test.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
test.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h test.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
test.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h test.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
test.o: $(topdir)/test.h test.o: $(topdir)/test.h ../pathnames.h
times.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h times.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
times.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h times.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
times.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h times.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
times.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h times.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
times.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h times.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
times.o: $(BASHINCDIR)/posixtime.h times.o: $(BASHINCDIR)/posixtime.h ../pathnames.h
trap.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h trap.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
trap.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/externs.h trap.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h $(topdir)/externs.h
trap.o: $(topdir)/quit.h $(srcdir)/common.h $(BASHINCDIR)/maxpath.h trap.o: $(topdir)/quit.h $(srcdir)/common.h $(BASHINCDIR)/maxpath.h
trap.o: $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h $(topdir)/subst.h trap.o: $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h $(topdir)/subst.h
trap.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h trap.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
trap.o: $(topdir)/findcmd.h trap.o: $(topdir)/findcmd.h ../pathnames.h
type.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h type.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
type.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h type.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
type.o: $(topdir)/quit.h $(srcdir)/common.h $(BASHINCDIR)/maxpath.h type.o: $(topdir)/quit.h $(srcdir)/common.h $(BASHINCDIR)/maxpath.h
type.o: $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h $(topdir)/subst.h type.o: $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h $(topdir)/subst.h
type.o: $(topdir)/externs.h $(topdir)/hashcmd.h type.o: $(topdir)/externs.h $(topdir)/hashcmd.h ../pathnames.h
type.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h type.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
ulimit.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h ulimit.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
ulimit.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h ulimit.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
ulimit.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h ulimit.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
ulimit.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h ulimit.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
ulimit.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h ulimit.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
ulimit.o: ../pathnames.h
umask.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h umask.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
umask.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h umask.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
umask.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h umask.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
umask.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h umask.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
umask.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h umask.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
umask.o: $(BASHINCDIR)/chartypes.h umask.o: $(BASHINCDIR)/chartypes.h ../pathnames.h
wait.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h wait.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
wait.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h wait.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
wait.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h wait.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
wait.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h wait.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
wait.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h wait.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
wait.o: $(topdir)/jobs.h wait.o: $(topdir)/jobs.h
wait.o: $(BASHINCDIR)/chartypes.h wait.o: $(BASHINCDIR)/chartypes.h ../pathnames.h
shopt.o: $(topdir)/command.h ../config.h $(BASHINCDIR)/memalloc.h
shopt.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
shopt.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
shopt.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
shopt.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/unwind_prot.h $(topdir)/variables.h $(topdir)/conftypes.h
shopt.o: $(srcdir)/common.h $(srcdir)/bashgetopt.h
complete.o: ../config.h complete.o: ../config.h ../pathnames.h
complete.o: ${topdir}/shell.h $(topdir)/syntax.h ${topdir}/bashjmp.h ${BASHINCDIR}/posixjmp.h ${topdir}/sig.h complete.o: ${topdir}/shell.h $(topdir)/syntax.h ${topdir}/bashjmp.h ${BASHINCDIR}/posixjmp.h ${topdir}/sig.h
complete.o: ${topdir}/unwind_prot.h ${topdir}/variables.h complete.o: ${topdir}/unwind_prot.h ${topdir}/variables.h
complete.o: ${topdir}/bashtypes.h ${topdir}/bashansi.h ${BASHINCDIR}/ansi_stdlib.h complete.o: ${topdir}/bashtypes.h ${topdir}/bashansi.h ${BASHINCDIR}/ansi_stdlib.h
@ -600,7 +616,7 @@ mapfile.o: $(topdir)/error.h $(topdir)/general.h $(topdir)/xmalloc.h
mapfile.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h mapfile.o: $(topdir)/quit.h $(topdir)/dispose_cmd.h $(topdir)/make_cmd.h
mapfile.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h mapfile.o: $(topdir)/subst.h $(topdir)/externs.h $(BASHINCDIR)/maxpath.h
mapfile.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/variables.h $(topdir)/conftypes.h mapfile.o: $(topdir)/shell.h $(topdir)/syntax.h $(topdir)/variables.h $(topdir)/conftypes.h
mapfile.o: $(topdir)/arrayfunc.h mapfile.o: $(topdir)/arrayfunc.h ../pathnames.h
#bind.o: $(RL_LIBSRC)chardefs.h $(RL_LIBSRC)readline.h $(RL_LIBSRC)keymaps.h #bind.o: $(RL_LIBSRC)chardefs.h $(RL_LIBSRC)readline.h $(RL_LIBSRC)keymaps.h

View File

@ -255,7 +255,7 @@ bind_builtin (list)
if ((flags & RFLAG) && remove_seq) if ((flags & RFLAG) && remove_seq)
{ {
if (rl_set_key (remove_seq, (rl_command_func_t *)NULL, rl_get_keymap ()) != 0) if (rl_bind_keyseq (remove_seq, (rl_command_func_t *)NULL) != 0)
{ {
builtin_error (_("`%s': cannot unbind"), remove_seq); builtin_error (_("`%s': cannot unbind"), remove_seq);
BIND_RETURN (EXECUTION_FAILURE); BIND_RETURN (EXECUTION_FAILURE);

View File

@ -100,6 +100,31 @@ command_builtin (list)
if (list == 0) if (list == 0)
return (EXECUTION_SUCCESS); return (EXECUTION_SUCCESS);
#if defined (RESTRICTED_SHELL)
if (use_standard_path && restricted)
{
sh_restricted ("-p");
return (EXECUTION_FAILURE);
}
#endif
begin_unwind_frame ("command_builtin");
if (use_standard_path)
{
old_path = get_string_value ("PATH");
/* If old_path is NULL, $PATH is unset. If so, we want to make sure
it's unset after this command completes. */
if (old_path)
old_path = savestring (old_path);
add_unwind_protect ((Function *)restore_path, old_path);
standard_path = get_standard_path ();
bind_variable ("PATH", standard_path ? standard_path : "", 0);
stupidly_hack_special_variables ("PATH");
FREE (standard_path);
}
if (verbose) if (verbose)
{ {
int found, any_found; int found, any_found;
@ -113,37 +138,15 @@ command_builtin (list)
any_found += found; any_found += found;
} }
run_unwind_frame ("command_builtin");
return (any_found ? EXECUTION_SUCCESS : EXECUTION_FAILURE); return (any_found ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
} }
#if defined (RESTRICTED_SHELL)
if (use_standard_path && restricted)
{
sh_restricted ("-p");
return (EXECUTION_FAILURE);
}
#endif
begin_unwind_frame ("command_builtin");
/* We don't want this to be reparsed (consider command echo 'foo &'), so
just make a simple_command structure and call execute_command with it. */
if (use_standard_path)
{
old_path = get_string_value ("PATH");
/* If old_path is NULL, $PATH is unset. If so, we want to make sure
it's unset after this command completes. */
if (old_path)
old_path = savestring (old_path);
add_unwind_protect ((Function *)restore_path, old_path);
standard_path = get_standard_path ();
bind_variable ("PATH", standard_path ? standard_path : "", 0);
FREE (standard_path);
}
#define COMMAND_BUILTIN_FLAGS (CMD_NO_FUNCTIONS | CMD_INHIBIT_EXPANSION | CMD_COMMAND_BUILTIN) #define COMMAND_BUILTIN_FLAGS (CMD_NO_FUNCTIONS | CMD_INHIBIT_EXPANSION | CMD_COMMAND_BUILTIN)
/* We don't want this to be reparsed (consider command echo 'foo &'), so
just make a simple_command structure and call execute_command with it. */
command = make_bare_simple_command (); command = make_bare_simple_command ();
command->value.Simple->words = (WORD_LIST *)copy_word_list (list); command->value.Simple->words = (WORD_LIST *)copy_word_list (list);
command->value.Simple->redirects = (REDIRECT *)NULL; command->value.Simple->redirects = (REDIRECT *)NULL;
@ -182,6 +185,8 @@ restore_path (var)
} }
else else
unbind_variable ("PATH"); unbind_variable ("PATH");
stupidly_hack_special_variables ("PATH");
} }
/* Return a value for PATH that is guaranteed to find all of the standard /* Return a value for PATH that is guaranteed to find all of the standard

View File

@ -612,7 +612,7 @@ get_job_by_name (name, flags)
match = STREQN (p->command, name, cl); match = STREQN (p->command, name, cl);
} }
else if (flags & JM_SUBSTRING) else if (flags & JM_SUBSTRING)
match = strindex (p->command, name) != (char *)0; match = strcasestr (p->command, name) != (char *)0;
else else
match = STREQN (p->command, name, wl); match = STREQN (p->command, name, wl);

View File

@ -139,7 +139,11 @@ extern char **get_shopt_options __P((void));
extern int shopt_setopt __P((char *, int)); extern int shopt_setopt __P((char *, int));
extern int shopt_listopt __P((char *, int)); extern int shopt_listopt __P((char *, int));
extern int set_login_shell __P((int)); extern int set_login_shell __P((char *, int));
extern void set_bashopts __P((void));
extern void parse_bashopts __P((char *));
extern void initialize_bashopts __P((int));
/* Functions from type.def */ /* Functions from type.def */
extern int describe_command __P((char *, int)); extern int describe_command __P((char *, int));

View File

@ -23,7 +23,7 @@ $PRODUCES complete.c
$BUILTIN complete $BUILTIN complete
$DEPENDS_ON PROGRAMMABLE_COMPLETION $DEPENDS_ON PROGRAMMABLE_COMPLETION
$FUNCTION complete_builtin $FUNCTION complete_builtin
$SHORT_DOC complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...] $SHORT_DOC complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat] [-W wordlist] [-F function] [-C command] [-X filterpat] [-P prefix] [-S suffix] [name ...]
Specify how arguments are to be completed by Readline. Specify how arguments are to be completed by Readline.
For each NAME, specify how arguments are to be completed. If no options For each NAME, specify how arguments are to be completed. If no options
@ -34,9 +34,14 @@ Options:
-p print existing completion specifications in a reusable format -p print existing completion specifications in a reusable format
-r remove a completion specification for each NAME, or, if no -r remove a completion specification for each NAME, or, if no
NAMEs are supplied, all completion specifications NAMEs are supplied, all completion specifications
-D apply the completions and actions as the default for commands
without any specific completion defined
-E apply the completions and actions to "empty" commands --
completion attempted on a blank line
When completion is attempted, the actions are applied in the order the When completion is attempted, the actions are applied in the order the
uppercase-letter options are listed above. uppercase-letter options are listed above. The -D option takes
precedence over -E.
Exit Status: Exit Status:
Returns success unless an invalid option is supplied or an error occurs. Returns success unless an invalid option is supplied or an error occurs.
@ -72,6 +77,7 @@ $END
struct _optflags { struct _optflags {
int pflag; int pflag;
int rflag; int rflag;
int Dflag;
int Eflag; int Eflag;
}; };
@ -187,7 +193,7 @@ build_actions (list, flagp, actp, optp)
opt_given = 0; opt_given = 0;
reset_internal_getopt (); reset_internal_getopt ();
while ((opt = internal_getopt (list, "abcdefgjko:prsuvA:G:W:P:S:X:F:C:E")) != -1) while ((opt = internal_getopt (list, "abcdefgjko:prsuvA:G:W:P:S:X:F:C:DE")) != -1)
{ {
opt_given = 1; opt_given = 1;
switch (opt) switch (opt)
@ -275,6 +281,18 @@ build_actions (list, flagp, actp, optp)
case 'C': case 'C':
Carg = list_optarg; Carg = list_optarg;
break; break;
case 'D':
if (flagp)
{
flagp->Dflag = 1;
break;
}
else
{
sh_invalidopt ("-D");
builtin_usage ();
return (EX_USAGE);
}
case 'E': case 'E':
if (flagp) if (flagp)
{ {
@ -334,7 +352,7 @@ complete_builtin (list)
return (EXECUTION_SUCCESS); return (EXECUTION_SUCCESS);
} }
opt_given = oflags.pflag = oflags.rflag = oflags.Eflag = 0; opt_given = oflags.pflag = oflags.rflag = oflags.Dflag = oflags.Eflag = 0;
acts = copts = (unsigned long)0L; acts = copts = (unsigned long)0L;
Garg = Warg = Parg = Sarg = Xarg = Farg = Carg = (char *)NULL; Garg = Warg = Parg = Sarg = Xarg = Farg = Carg = (char *)NULL;
@ -349,7 +367,8 @@ complete_builtin (list)
list = loptend; list = loptend;
wl = oflags.Eflag ? make_word_list (make_bare_word ("_EmptycmD_"), (WORD_LIST *)NULL) : 0; wl = oflags.Dflag ? make_word_list (make_bare_word (DEFAULTCMD), (WORD_LIST *)NULL)
: (oflags.Eflag ? make_word_list (make_bare_word (EMPTYCMD), (WORD_LIST *)NULL) : 0);
/* -p overrides everything else */ /* -p overrides everything else */
if (oflags.pflag || (list == 0 && opt_given == 0)) if (oflags.pflag || (list == 0 && opt_given == 0))
@ -540,7 +559,12 @@ print_one_completion (cmd, cs)
/* simple arguments that don't require quoting */ /* simple arguments that don't require quoting */
PRINTARG (cs->funcname, "-F"); PRINTARG (cs->funcname, "-F");
printf ("%s\n", cmd); if (STREQ (cmd, EMPTYCMD))
printf ("-E\n");
else if (STREQ (cmd, DEFAULTCMD))
printf ("-D\n");
else
printf ("%s\n", cmd);
return (0); return (0);
} }
@ -575,7 +599,12 @@ print_compopts (cmd, cs, full)
PRINTCOMPOPT (COPT_PLUSDIRS, "plusdirs"); PRINTCOMPOPT (COPT_PLUSDIRS, "plusdirs");
} }
printf ("%s\n", cmd); if (STREQ (cmd, EMPTYCMD))
printf ("-E\n");
else if (STREQ (cmd, DEFAULTCMD))
printf ("-D\n");
else
printf ("%s\n", cmd);
} }
static int static int
@ -683,7 +712,7 @@ compgen_builtin (list)
cs->filterpat = STRDUP (Xarg); cs->filterpat = STRDUP (Xarg);
rval = EXECUTION_FAILURE; rval = EXECUTION_FAILURE;
sl = gen_compspec_completions (cs, "compgen", word, 0, 0); sl = gen_compspec_completions (cs, "compgen", word, 0, 0, 0);
/* If the compspec wants the bash default completions, temporarily /* If the compspec wants the bash default completions, temporarily
turn off programmable completion and call the bash completion code. */ turn off programmable completion and call the bash completion code. */
@ -720,7 +749,7 @@ compgen_builtin (list)
$BUILTIN compopt $BUILTIN compopt
$DEPENDS_ON PROGRAMMABLE_COMPLETION $DEPENDS_ON PROGRAMMABLE_COMPLETION
$FUNCTION compopt_builtin $FUNCTION compopt_builtin
$SHORT_DOC compopt [-o|+o option] [name ...] $SHORT_DOC compopt [-o|+o option] [-DE] [name ...]
Modify or display completion options. Modify or display completion options.
Modify the completion options for each NAME, or, if no NAMEs are supplied, Modify the completion options for each NAME, or, if no NAMEs are supplied,
@ -729,6 +758,8 @@ the completion options for each NAME or the current completion specification.
Options: Options:
-o option Set completion option OPTION for each NAME -o option Set completion option OPTION for each NAME
-D Change options for the "default" command completion
-E Change options for the "empty" command completion
Using `+o' instead of `-o' turns off the specified option. Using `+o' instead of `-o' turns off the specified option.
@ -749,15 +780,15 @@ int
compopt_builtin (list) compopt_builtin (list)
WORD_LIST *list; WORD_LIST *list;
{ {
int opts_on, opts_off, *opts, opt, oind, ret, Eflag; int opts_on, opts_off, *opts, opt, oind, ret, Dflag, Eflag;
WORD_LIST *l; WORD_LIST *l, *wl;
COMPSPEC *cs; COMPSPEC *cs;
opts_on = opts_off = 0; opts_on = opts_off = Eflag = Dflag = 0;
ret = EXECUTION_SUCCESS; ret = EXECUTION_SUCCESS;
reset_internal_getopt (); reset_internal_getopt ();
while ((opt = internal_getopt (list, "+o:")) != EOF) while ((opt = internal_getopt (list, "+o:DE")) != EOF)
{ {
opts = (list_opttype == '-') ? &opts_on : &opts_off; opts = (list_opttype == '-') ? &opts_on : &opts_off;
@ -772,6 +803,12 @@ compopt_builtin (list)
} }
*opts |= compopts[oind].optflag; *opts |= compopts[oind].optflag;
break; break;
case 'D':
Dflag = 1;
break;
case 'E':
Eflag = 1;
break;
default: default:
builtin_usage (); builtin_usage ();
return (EX_USAGE); return (EX_USAGE);
@ -779,7 +816,10 @@ compopt_builtin (list)
} }
list = loptend; list = loptend;
if (list == 0) wl = Dflag ? make_word_list (make_bare_word (DEFAULTCMD), (WORD_LIST *)NULL)
: (Eflag ? make_word_list (make_bare_word (EMPTYCMD), (WORD_LIST *)NULL) : 0);
if (list == 0 && wl == 0)
{ {
if (RL_ISSTATE (RL_STATE_COMPLETING) == 0 || pcomp_curcs == 0) if (RL_ISSTATE (RL_STATE_COMPLETING) == 0 || pcomp_curcs == 0)
{ {
@ -805,7 +845,7 @@ compopt_builtin (list)
return (ret); return (ret);
} }
for (l = list; l; l = l->next) for (l = wl ? wl : list; l; l = l->next)
{ {
cs = progcomp_search (l->word->word); cs = progcomp_search (l->word->word);
if (cs == 0) if (cs == 0)

View File

@ -503,14 +503,19 @@ declare_internal (list, local_var)
assign_array_var_from_string (var, value, aflags); assign_array_var_from_string (var, value, aflags);
else if (simple_array_assign && subscript_start) else if (simple_array_assign && subscript_start)
{ {
/* declare [-a] name[N]=value */ /* declare [-aA] name[N]=value */
*subscript_start = '['; /* ] */ *subscript_start = '['; /* ] */
var = assign_array_element (name, value, 0); /* XXX - not aflags */ var = assign_array_element (name, value, 0); /* XXX - not aflags */
*subscript_start = '\0'; *subscript_start = '\0';
} }
else if (simple_array_assign) else if (simple_array_assign)
/* let bind_array_variable take care of this. */ {
bind_array_variable (name, 0, value, aflags); /* let bind_{array,assoc}_variable take care of this. */
if (assoc_p (var))
bind_assoc_variable (var, name, "0", value, aflags);
else
bind_array_variable (name, 0, value, aflags);
}
else else
#endif #endif
/* bind_variable_value duplicates the essential internals of /* bind_variable_value duplicates the essential internals of

View File

@ -81,7 +81,7 @@ _evalfile (filename, flags)
{ {
volatile int old_interactive; volatile int old_interactive;
procenv_t old_return_catch; procenv_t old_return_catch;
int return_val, fd, result, pflags; int return_val, fd, result, pflags, i, nnull;
ssize_t nr; /* return value from read(2) */ ssize_t nr; /* return value from read(2) */
char *string; char *string;
struct stat finfo; struct stat finfo;
@ -186,6 +186,26 @@ file_error_and_exit:
return ((flags & FEVAL_BUILTIN) ? EX_BINARY_FILE : -1); return ((flags & FEVAL_BUILTIN) ? EX_BINARY_FILE : -1);
} }
i = strlen (string);
if (i < nr)
{
for (nnull = i = 0; i < nr; i++)
if (string[i] == '\0')
{
memmove (string+i, string+i+1, nr - i);
nr--;
/* Even if the `check binary' flag is not set, we want to avoid
sourcing files with more than 256 null characters -- that
probably indicates a binary file. */
if ((flags & FEVAL_BUILTIN) && ++nnull > 256)
{
free (string);
(*errfunc) (_("%s: cannot execute binary file"), filename);
return ((flags & FEVAL_BUILTIN) ? EX_BINARY_FILE : -1);
}
}
}
if (flags & FEVAL_UNWINDPROT) if (flags & FEVAL_UNWINDPROT)
{ {
begin_unwind_frame ("_evalfile"); begin_unwind_frame ("_evalfile");

View File

@ -43,6 +43,7 @@
#include "../execute_cmd.h" #include "../execute_cmd.h"
#include "../redir.h" #include "../redir.h"
#include "../trap.h" #include "../trap.h"
#include "../bashintl.h"
#include <y.tab.h> #include <y.tab.h>
@ -51,6 +52,7 @@
#endif #endif
#include "common.h" #include "common.h"
#include "builtext.h"
#if !defined (errno) #if !defined (errno)
extern int errno; extern int errno;
@ -67,6 +69,7 @@ extern int loop_level;
extern int executing_list; extern int executing_list;
extern int comsub_ignore_return; extern int comsub_ignore_return;
extern int posixly_correct; extern int posixly_correct;
extern sh_builtin_func_t *this_shell_builtin;
int parse_and_execute_level = 0; int parse_and_execute_level = 0;
@ -324,6 +327,19 @@ parse_and_execute (string, from_file, flags)
{ {
last_result = EXECUTION_FAILURE; last_result = EXECUTION_FAILURE;
if (interactive_shell == 0 && this_shell_builtin &&
(this_shell_builtin == source_builtin || this_shell_builtin == eval_builtin) &&
last_command_exit_value == EX_BADSYNTAX && posixly_correct)
{
#if 0 /* XXX - for bash-4.2 */
should_jump_to_top_level = 1;
code = ERREXIT;
last_command_exit_value = EX_BADUSAGE;
#else
internal_warning (_("syntax errors in . or eval will cause future versions of the shell to abort as Posix requires"));
#endif
}
/* Since we are shell compatible, syntax errors in a script /* Since we are shell compatible, syntax errors in a script
abort the execution of the script. Right? */ abort the execution of the script. Right? */
break; break;

View File

@ -23,7 +23,7 @@ $PRODUCES help.c
$BUILTIN help $BUILTIN help
$FUNCTION help_builtin $FUNCTION help_builtin
$DEPENDS_ON HELP_BUILTIN $DEPENDS_ON HELP_BUILTIN
$SHORT_DOC help [-ds] [pattern ...] $SHORT_DOC help [-dms] [pattern ...]
Display information about builtin commands. Display information about builtin commands.
Displays brief summaries of builtin commands. If PATTERN is Displays brief summaries of builtin commands. If PATTERN is
@ -350,6 +350,8 @@ A star (*) next to a name means that the command is disabled.\n\
width /= 2; width /= 2;
if (width > sizeof (blurb)) if (width > sizeof (blurb))
width = sizeof (blurb); width = sizeof (blurb);
if (width <= 3)
width = 40;
height = (num_shell_builtins + 1) / 2; /* number of rows */ height = (num_shell_builtins + 1) / 2; /* number of rows */
for (i = 0; i < height; i++) for (i = 0; i < height; i++)

View File

@ -121,6 +121,9 @@ kill_builtin (list)
else else
sig = decode_signal (sigspec, dflags); sig = decode_signal (sigspec, dflags);
list = list->next; list = list->next;
#if 0
saw_signal++; /* XXX - for bash-4.2 */
#endif
} }
else else
{ {
@ -141,7 +144,7 @@ kill_builtin (list)
/* If this is a signal specification then process it. We only process /* If this is a signal specification then process it. We only process
the first one seen; other arguments may signify process groups (e.g, the first one seen; other arguments may signify process groups (e.g,
-num == process group num). */ -num == process group num). */
else if ((*word == '-') && !saw_signal) else if (*word == '-' && saw_signal == 0)
{ {
sigspec = word + 1; sigspec = word + 1;
sig = decode_signal (sigspec, dflags); sig = decode_signal (sigspec, dflags);

View File

@ -24,11 +24,11 @@ $PRODUCES mapfile.c
$BUILTIN mapfile $BUILTIN mapfile
$FUNCTION mapfile_builtin $FUNCTION mapfile_builtin
$SHORT_DOC mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array] $SHORT_DOC mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
Read lines from the standard input into an array variable. Read lines from the standard input into an indexed array variable.
Read lines from the standard input into the array variable ARRAY, or from Read lines from the standard input into the indexed array variable ARRAY, or
file descriptor FD if the -u option is supplied. The variable MAPFILE is from file descriptor FD if the -u option is supplied. The variable MAPFILE
the default ARRAY. is the default ARRAY.
Options: Options:
-n count Copy at most COUNT lines. If COUNT is 0, all lines are copied. -n count Copy at most COUNT lines. If COUNT is 0, all lines are copied.
@ -50,7 +50,8 @@ If not supplied with an explicit origin, mapfile will clear ARRAY before
assigning to it. assigning to it.
Exit Status: Exit Status:
Returns success unless an invalid option is given or ARRAY is readonly. Returns success unless an invalid option is given or ARRAY is readonly or
not an indexed array.
$END $END
$BUILTIN readarray $BUILTIN readarray
@ -71,6 +72,7 @@ $END
#endif #endif
#include "bashansi.h" #include "bashansi.h"
#include "bashintl.h"
#include <stdio.h> #include <stdio.h>
#include <errno.h> #include <errno.h>
@ -110,10 +112,10 @@ run_callback(callback, current_index)
execlen += 2; execlen += 2;
execstr = xmalloc (execlen); execstr = xmalloc (execlen);
flags = 0; flags = SEVAL_NOHIST;
#if 0 #if 0
if (interactive) if (interactive)
flags |= SEVAL_NOHIST|SEVAL_INTERACT; flags |= SEVAL_INTERACT;
#endif #endif
snprintf (execstr, execlen, "%s %d", callback, current_index); snprintf (execstr, execlen, "%s %d", callback, current_index);
return parse_and_execute(execstr, NULL, flags); return parse_and_execute(execstr, NULL, flags);
@ -153,11 +155,17 @@ mapfile (fd, line_count_goal, origin, nskip, callback_quantum, callback, array_n
entry = find_or_make_array_variable (array_name, 1); entry = find_or_make_array_variable (array_name, 1);
if (entry == 0 || readonly_p (entry) || noassign_p (entry)) if (entry == 0 || readonly_p (entry) || noassign_p (entry))
{ {
if (readonly_p (entry)) if (entry && readonly_p (entry))
err_readonly (array_name); err_readonly (array_name);
return (EXECUTION_FAILURE); return (EXECUTION_FAILURE);
} }
else if (array_p (entry) == 0)
{
builtin_error (_("%s: not an indexed array"), array_name);
return (EXECUTION_FAILURE);
}
if (flags & MAPF_CLEARARRAY) if (flags & MAPF_CLEARARRAY)
array_flush (array_cell (entry)); array_flush (array_cell (entry));
@ -281,7 +289,7 @@ mapfile_builtin (list)
break; break;
case 'c': case 'c':
code = legal_number (list_optarg, &intval); code = legal_number (list_optarg, &intval);
if (code == 0 || intval < 0 || intval != (unsigned)intval) if (code == 0 || intval <= 0 || intval != (unsigned)intval)
{ {
builtin_error (_("%s: invalid callback quantum"), list_optarg); builtin_error (_("%s: invalid callback quantum"), list_optarg);
return (EXECUTION_FAILURE); return (EXECUTION_FAILURE);

View File

@ -135,7 +135,7 @@ extern int errno;
{ \ { \
if (vflag) \ if (vflag) \
{ \ { \
bind_variable (vname, vbuf, 0); \ bind_printf_variable (vname, vbuf, 0); \
stupidly_hack_special_variables (vname); \ stupidly_hack_special_variables (vname); \
} \ } \
if (conv_bufsize > 4096 ) \ if (conv_bufsize > 4096 ) \
@ -156,6 +156,7 @@ extern int errno;
fflush (stdout); \ fflush (stdout); \
if (ferror (stdout)) \ if (ferror (stdout)) \
{ \ { \
sh_wrerror (); \
clearerr (stdout); \ clearerr (stdout); \
return (EXECUTION_FAILURE); \ return (EXECUTION_FAILURE); \
} \ } \
@ -166,11 +167,11 @@ extern int errno;
#define SKIP1 "#'-+ 0" #define SKIP1 "#'-+ 0"
#define LENMODS "hjlLtz" #define LENMODS "hjlLtz"
#ifndef HAVE_ASPRINTF #if !HAVE_ASPRINTF
extern int asprintf __P((char **, const char *, ...)) __attribute__((__format__ (printf, 2, 3))); extern int asprintf __P((char **, const char *, ...)) __attribute__((__format__ (printf, 2, 3)));
#endif #endif
#ifndef HAVE_VSNPRINTF #if !HAVE_VSNPRINTF
extern int vsnprintf __P((char *, size_t, const char *, ...)) __attribute__((__format__ (printf, 3, 4))); extern int vsnprintf __P((char *, size_t, const char *, ...)) __attribute__((__format__ (printf, 3, 4)));
#endif #endif
@ -186,6 +187,7 @@ static char *getstr __P((void));
static int getint __P((void)); static int getint __P((void));
static intmax_t getintmax __P((void)); static intmax_t getintmax __P((void));
static uintmax_t getuintmax __P((void)); static uintmax_t getuintmax __P((void));
static SHELL_VAR *bind_printf_variable __P((char *, char *, int));
#if defined (HAVE_LONG_DOUBLE) && HAVE_DECL_STRTOLD && !defined(STRTOLD_BROKEN) #if defined (HAVE_LONG_DOUBLE) && HAVE_DECL_STRTOLD && !defined(STRTOLD_BROKEN)
typedef long double floatmax_t; typedef long double floatmax_t;
@ -234,7 +236,12 @@ printf_builtin (list)
switch (ch) switch (ch)
{ {
case 'v': case 'v':
if (legal_identifier (vname = list_optarg)) vname = list_optarg;
#if defined (ARRAY_VARS)
if (legal_identifier (vname) || valid_array_reference (vname))
#else
if (legal_identifier (vname))
#endif
{ {
vflag = 1; vflag = 1;
vblen = 0; vblen = 0;
@ -997,7 +1004,9 @@ getintmax ()
shall continue processing any remaining operands and shall write the shall continue processing any remaining operands and shall write the
value accumulated at the time the error was detected to standard value accumulated at the time the error was detected to standard
output.'' Yecch. */ output.'' Yecch. */
ret = 0; #if 0
ret = 0; /* return partially-converted value from strtoimax */
#endif
conversion_error = 1; conversion_error = 1;
} }
else if (errno == ERANGE) else if (errno == ERANGE)
@ -1091,3 +1100,19 @@ asciicode ()
garglist = garglist->next; garglist = garglist->next;
return (ch); return (ch);
} }
static SHELL_VAR *
bind_printf_variable (name, value, flags)
char *name;
char *value;
int flags;
{
#if defined (ARRAY_VARS)
if (valid_array_reference (name) == 0)
return (bind_variable (name, value, flags));
else
return (assign_array_element (name, value, flags));
#else /* !ARRAY_VARS */
return bind_variable (name, value, flags);
#endif /* !ARRAY_VARS */
}

View File

@ -22,7 +22,7 @@ $PRODUCES read.c
$BUILTIN read $BUILTIN read
$FUNCTION read_builtin $FUNCTION read_builtin
$SHORT_DOC read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-p prompt] [-t timeout] [-u fd] [name ...] $SHORT_DOC read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
Read a line from the standard input and split it into fields. Read a line from the standard input and split it into fields.
Reads a single line from the standard input, or from file descriptor FD Reads a single line from the standard input, or from file descriptor FD
@ -42,7 +42,10 @@ Options:
-e use Readline to obtain the line in an interactive shell -e use Readline to obtain the line in an interactive shell
-i text Use TEXT as the initial text for Readline -i text Use TEXT as the initial text for Readline
-n nchars return after reading NCHARS characters rather than waiting -n nchars return after reading NCHARS characters rather than waiting
for a newline for a newline, but honor a delimiter if fewer than NCHARS
characters are read before the delimiter
-N nchars return only after reading exactly NCHARS characters, unless
EOF is encountered or read times out, ignoring any delimiter
-p prompt output the string PROMPT without a trailing newline before -p prompt output the string PROMPT without a trailing newline before
attempting to read attempting to read
-r do not allow backslashes to escape any characters -r do not allow backslashes to escape any characters
@ -155,7 +158,7 @@ read_builtin (list)
register char *varname; register char *varname;
int size, i, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2; int size, i, nr, pass_next, saw_escape, eof, opt, retval, code, print_ps2;
int input_is_tty, input_is_pipe, unbuffered_read, skip_ctlesc, skip_ctlnul; int input_is_tty, input_is_pipe, unbuffered_read, skip_ctlesc, skip_ctlnul;
int raw, edit, nchars, silent, have_timeout, fd; int raw, edit, nchars, silent, have_timeout, ignore_delim, fd;
unsigned int tmsec, tmusec; unsigned int tmsec, tmusec;
long ival, uval; long ival, uval;
intmax_t intval; intmax_t intval;
@ -211,9 +214,10 @@ read_builtin (list)
tmsec = tmusec = 0; /* no timeout */ tmsec = tmusec = 0; /* no timeout */
nr = nchars = input_is_tty = input_is_pipe = unbuffered_read = have_timeout = 0; nr = nchars = input_is_tty = input_is_pipe = unbuffered_read = have_timeout = 0;
delim = '\n'; /* read until newline */ delim = '\n'; /* read until newline */
ignore_delim = 0;
reset_internal_getopt (); reset_internal_getopt ();
while ((opt = internal_getopt (list, "ersa:d:i:n:p:t:u:")) != -1) while ((opt = internal_getopt (list, "ersa:d:i:n:p:t:u:N:")) != -1)
{ {
switch (opt) switch (opt)
{ {
@ -255,6 +259,9 @@ read_builtin (list)
tmusec = uval; tmusec = uval;
} }
break; break;
case 'N':
ignore_delim = 1;
delim = -1;
case 'n': case 'n':
code = legal_number (list_optarg, &intval); code = legal_number (list_optarg, &intval);
if (code == 0 || intval < 0 || intval != (int)intval) if (code == 0 || intval < 0 || intval != (int)intval)
@ -299,10 +306,17 @@ read_builtin (list)
return (input_avail (fd) ? EXECUTION_SUCCESS : EXECUTION_FAILURE); return (input_avail (fd) ? EXECUTION_SUCCESS : EXECUTION_FAILURE);
#endif #endif
/* If we're asked to ignore the delimiter, make sure we do. */
if (ignore_delim)
delim = -1;
/* IF IFS is unset, we use the default of " \t\n". */ /* IF IFS is unset, we use the default of " \t\n". */
ifs_chars = getifs (); ifs_chars = getifs ();
if (ifs_chars == 0) /* XXX - shouldn't happen */ if (ifs_chars == 0) /* XXX - shouldn't happen */
ifs_chars = ""; ifs_chars = "";
/* If we want to read exactly NCHARS chars, don't split on IFS */
if (ignore_delim)
ifs_chars = "";
for (skip_ctlesc = skip_ctlnul = 0, e = ifs_chars; *e; e++) for (skip_ctlesc = skip_ctlnul = 0, e = ifs_chars; *e; e++)
skip_ctlesc |= *e == CTLESC, skip_ctlnul |= *e == CTLNUL; skip_ctlesc |= *e == CTLESC, skip_ctlnul |= *e == CTLNUL;
@ -601,15 +615,14 @@ add_char:
if (unbuffered_read == 0) if (unbuffered_read == 0)
zsyncfd (fd); zsyncfd (fd);
interrupt_immediately--;
terminate_immediately--;
discard_unwind_frame ("read_builtin"); discard_unwind_frame ("read_builtin");
retval = eof ? EXECUTION_FAILURE : EXECUTION_SUCCESS; retval = eof ? EXECUTION_FAILURE : EXECUTION_SUCCESS;
assign_vars: assign_vars:
interrupt_immediately--;
terminate_immediately--;
#if defined (ARRAY_VARS) #if defined (ARRAY_VARS)
/* If -a was given, take the string read, break it into a list of words, /* If -a was given, take the string read, break it into a list of words,
an assign them to `arrayname' in turn. */ an assign them to `arrayname' in turn. */

View File

@ -112,19 +112,20 @@ extern int debugging_mode;
static void shopt_error __P((char *)); static void shopt_error __P((char *));
static int set_shellopts_after_change __P((int)); static int set_shellopts_after_change __P((char *, int));
static int shopt_enable_hostname_completion __P((char *, int));
static int set_compatibility_level __P((int)); static int set_compatibility_level __P((char *, int));
#if defined (RESTRICTED_SHELL) #if defined (RESTRICTED_SHELL)
static int set_restricted_shell __P((int)); static int set_restricted_shell __P((char *, int));
#endif #endif
static int shopt_login_shell; static int shopt_login_shell;
static int shopt_compat31; static int shopt_compat31;
static int shopt_compat32; static int shopt_compat32;
static int shopt_compat40;
typedef int shopt_set_func_t __P((int)); typedef int shopt_set_func_t __P((char *, int));
static struct { static struct {
char *name; char *name;
@ -144,6 +145,7 @@ static struct {
#endif #endif
{ "compat31", &shopt_compat31, set_compatibility_level }, { "compat31", &shopt_compat31, set_compatibility_level },
{ "compat32", &shopt_compat32, set_compatibility_level }, { "compat32", &shopt_compat32, set_compatibility_level },
{ "compat40", &shopt_compat40, set_compatibility_level },
#if defined (READLINE) #if defined (READLINE)
{ "dirspell", &dircomplete_spelling, (shopt_set_func_t *)NULL }, { "dirspell", &dircomplete_spelling, (shopt_set_func_t *)NULL },
#endif #endif
@ -169,7 +171,7 @@ static struct {
#if defined (READLINE) #if defined (READLINE)
{ "histreedit", &history_reediting, (shopt_set_func_t *)NULL }, { "histreedit", &history_reediting, (shopt_set_func_t *)NULL },
{ "histverify", &hist_verify, (shopt_set_func_t *)NULL }, { "histverify", &hist_verify, (shopt_set_func_t *)NULL },
{ "hostcomplete", &perform_hostname_completion, enable_hostname_completion }, { "hostcomplete", &perform_hostname_completion, shopt_enable_hostname_completion },
#endif #endif
{ "huponexit", &hup_on_exit, (shopt_set_func_t *)NULL }, { "huponexit", &hup_on_exit, (shopt_set_func_t *)NULL },
{ "interactive_comments", &interactive_comments, set_shellopts_after_change }, { "interactive_comments", &interactive_comments, set_shellopts_after_change },
@ -197,6 +199,10 @@ static struct {
{ (char *)0, (int *)0, (shopt_set_func_t *)NULL } { (char *)0, (int *)0, (shopt_set_func_t *)NULL }
}; };
#define N_SHOPT_OPTIONS (sizeof (shopt_vars) / sizeof (shopt_vars[0]))
#define GET_SHOPT_OPTION_VALUE(i) (*shopt_vars[i].value)
static const char * const on = "on"; static const char * const on = "on";
static const char * const off = "off"; static const char * const off = "off";
@ -340,9 +346,11 @@ toggle_shopts (mode, list, quiet)
{ {
*shopt_vars[ind].value = mode; /* 1 for set, 0 for unset */ *shopt_vars[ind].value = mode; /* 1 for set, 0 for unset */
if (shopt_vars[ind].set_func) if (shopt_vars[ind].set_func)
(*shopt_vars[ind].set_func) (mode); (*shopt_vars[ind].set_func) (shopt_vars[ind].name, mode);
} }
} }
set_bashopts ();
return (rval); return (rval);
} }
@ -479,7 +487,8 @@ set_shopt_o_options (mode, list, quiet)
/* If we set or unset interactive_comments with shopt, make sure the /* If we set or unset interactive_comments with shopt, make sure the
change is reflected in $SHELLOPTS. */ change is reflected in $SHELLOPTS. */
static int static int
set_shellopts_after_change (mode) set_shellopts_after_change (option_name, mode)
char *option_name;
int mode; int mode;
{ {
set_shellopts (); set_shellopts ();
@ -487,14 +496,36 @@ set_shellopts_after_change (mode)
} }
static int static int
set_compatibility_level (mode) shopt_enable_hostname_completion (option_name, mode)
char *option_name;
int mode;
{
return (enable_hostname_completion (mode));
}
static int
set_compatibility_level (option_name, mode)
char *option_name;
int mode; int mode;
{ {
/* Need to change logic here as we add more compatibility levels */ /* Need to change logic here as we add more compatibility levels */
/* First, check option_name so we can turn off other compat options when
one is set. */
if (mode && option_name[6] == '3' && option_name[7] == '1')
shopt_compat32 = shopt_compat40 = 0;
else if (mode && option_name[6] == '3' && option_name[7] == '2')
shopt_compat31 = shopt_compat40 = 0;
else if (mode && option_name[6] == '4' && option_name[7] == '0')
shopt_compat31 = shopt_compat32 = 0;
/* Then set shell_compatibility_level based on what remains */
if (shopt_compat31) if (shopt_compat31)
shell_compatibility_level = 31; shell_compatibility_level = 31;
else if (shopt_compat32) else if (shopt_compat32)
shell_compatibility_level = 32; shell_compatibility_level = 32;
else if (shopt_compat40)
shell_compatibility_level = 40;
else else
shell_compatibility_level = DEFAULT_COMPAT_LEVEL; shell_compatibility_level = DEFAULT_COMPAT_LEVEL;
return 0; return 0;
@ -504,7 +535,8 @@ set_compatibility_level (mode)
/* Don't allow the value of restricted_shell to be modified. */ /* Don't allow the value of restricted_shell to be modified. */
static int static int
set_restricted_shell (mode) set_restricted_shell (option_name, mode)
char *option_name;
int mode; int mode;
{ {
static int save_restricted = -1; static int save_restricted = -1;
@ -519,7 +551,8 @@ set_restricted_shell (mode)
/* Not static so shell.c can call it to initialize shopt_login_shell */ /* Not static so shell.c can call it to initialize shopt_login_shell */
int int
set_login_shell (mode) set_login_shell (option_name, mode)
char *option_name;
int mode; int mode;
{ {
shopt_login_shell = login_shell != 0; shopt_login_shell = login_shell != 0;
@ -579,3 +612,104 @@ shopt_listopt (name, reusable)
print_shopt (name, *shopt_vars[i].value, reusable ? PFLAG : 0); print_shopt (name, *shopt_vars[i].value, reusable ? PFLAG : 0);
return (sh_chkwrite (EXECUTION_SUCCESS)); return (sh_chkwrite (EXECUTION_SUCCESS));
} }
void
set_bashopts ()
{
char *value;
char tflag[N_SHOPT_OPTIONS];
int vsize, i, vptr, *ip, exported;
SHELL_VAR *v;
for (vsize = i = 0; shopt_vars[i].name; i++)
{
tflag[i] = 0;
if (GET_SHOPT_OPTION_VALUE (i))
{
vsize += strlen (shopt_vars[i].name) + 1;
tflag[i] = 1;
}
}
value = (char *)xmalloc (vsize + 1);
for (i = vptr = 0; shopt_vars[i].name; i++)
{
if (tflag[i])
{
strcpy (value + vptr, shopt_vars[i].name);
vptr += strlen (shopt_vars[i].name);
value[vptr++] = ':';
}
}
if (vptr)
vptr--; /* cut off trailing colon */
value[vptr] = '\0';
v = find_variable ("BASHOPTS");
/* Turn off the read-only attribute so we can bind the new value, and
note whether or not the variable was exported. */
if (v)
{
VUNSETATTR (v, att_readonly);
exported = exported_p (v);
}
else
exported = 0;
v = bind_variable ("BASHOPTS", value, 0);
/* Turn the read-only attribute back on, and turn off the export attribute
if it was set implicitly by mark_modified_vars and SHELLOPTS was not
exported before we bound the new value. */
VSETATTR (v, att_readonly);
if (mark_modified_vars && exported == 0 && exported_p (v))
VUNSETATTR (v, att_exported);
free (value);
}
void
parse_bashopts (value)
char *value;
{
char *vname;
int vptr, ind;
vptr = 0;
while (vname = extract_colon_unit (value, &vptr))
{
ind = find_shopt (vname);
if (ind >= 0)
*shopt_vars[ind].value = 1;
free (vname);
}
}
void
initialize_bashopts (no_bashopts)
int no_bashopts;
{
char *temp;
SHELL_VAR *var;
if (no_bashopts == 0)
{
var = find_variable ("BASHOPTS");
/* set up any shell options we may have inherited. */
if (var && imported_p (var))
{
temp = (array_p (var) || assoc_p (var)) ? (char *)NULL : savestring (value_cell (var));
if (temp)
{
parse_bashopts (temp);
free (temp);
}
}
}
/* Set up the $BASHOPTS variable. */
set_bashopts ();
}

View File

@ -35,11 +35,15 @@ enum r_instruction {
r_append_err_and_out r_append_err_and_out
}; };
/* Redirection flags; values for rflags */
#define REDIR_VARASSIGN 0x01
/* Redirection errors. */ /* Redirection errors. */
#define AMBIGUOUS_REDIRECT -1 #define AMBIGUOUS_REDIRECT -1
#define NOCLOBBER_REDIRECT -2 #define NOCLOBBER_REDIRECT -2
#define RESTRICTED_REDIRECT -3 /* can only happen in restricted shells. */ #define RESTRICTED_REDIRECT -3 /* can only happen in restricted shells. */
#define HEREDOC_REDIRECT -4 /* here-doc temp file can't be created */ #define HEREDOC_REDIRECT -4 /* here-doc temp file can't be created */
#define BADVAR_REDIRECT -5 /* something wrong with {varname}redir */
#define CLOBBERING_REDIRECT(ri) \ #define CLOBBERING_REDIRECT(ri) \
(ri == r_output_direction || ri == r_err_and_out) (ri == r_output_direction || ri == r_err_and_out)
@ -73,9 +77,9 @@ enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select,
#define W_QUOTED 0x000002 /* Some form of quote character is present. */ #define W_QUOTED 0x000002 /* Some form of quote character is present. */
#define W_ASSIGNMENT 0x000004 /* This word is a variable assignment. */ #define W_ASSIGNMENT 0x000004 /* This word is a variable assignment. */
#define W_GLOBEXP 0x000008 /* This word is the result of a glob expansion. */ #define W_GLOBEXP 0x000008 /* This word is the result of a glob expansion. */
#define W_NOSPLIT 0x000010 /* Do not perform word splitting on this word. */ #define W_NOSPLIT 0x000010 /* Do not perform word splitting on this word because ifs is empty string. */
#define W_NOGLOB 0x000020 /* Do not perform globbing on this word. */ #define W_NOGLOB 0x000020 /* Do not perform globbing on this word. */
#define W_NOSPLIT2 0x000040 /* Don't split word except for $@ expansion. */ #define W_NOSPLIT2 0x000040 /* Don't split word except for $@ expansion (using spaces) because context does not allow it. */
#define W_TILDEEXP 0x000080 /* Tilde expand this assignment word */ #define W_TILDEEXP 0x000080 /* Tilde expand this assignment word */
#define W_DOLLARAT 0x000100 /* $@ and its special handling */ #define W_DOLLARAT 0x000100 /* $@ and its special handling */
#define W_DOLLARSTAR 0x000200 /* $* and its special handling */ #define W_DOLLARSTAR 0x000200 /* $* and its special handling */
@ -135,7 +139,8 @@ typedef union {
(or translator in redir.c) encountered an out-of-range file descriptor. */ (or translator in redir.c) encountered an out-of-range file descriptor. */
typedef struct redirect { typedef struct redirect {
struct redirect *next; /* Next element, or NULL. */ struct redirect *next; /* Next element, or NULL. */
int redirector; /* Descriptor to be redirected. */ REDIRECTEE redirector; /* Descriptor or varname to be redirected. */
int rflags; /* Private flags for this redirection */
int flags; /* Flag value for `open'. */ int flags; /* Flag value for `open'. */
enum r_instruction instruction; /* What to do with the information. */ enum r_instruction instruction; /* What to do with the information. */
REDIRECTEE redirectee; /* File descriptor or filename */ REDIRECTEE redirectee; /* File descriptor or filename */

View File

@ -125,6 +125,10 @@
# define PPROMPT "$ " # define PPROMPT "$ "
#endif #endif
#if !defined (HAVE_SYSLOG) || !defined (HAVE_SYSLOG_H)
# undef SYSLOG_HISTORY
#endif
/************************************************/ /************************************************/
/* check multibyte capability for I18N code */ /* check multibyte capability for I18N code */
/************************************************/ /************************************************/

View File

@ -98,3 +98,14 @@
name is not found. If you want to name it something other than the name is not found. If you want to name it something other than the
default ("command_not_found_handle"), change it here. */ default ("command_not_found_handle"), change it here. */
/* #define NOTFOUND_HOOK "command_not_found_handle" */ /* #define NOTFOUND_HOOK "command_not_found_handle" */
/* Define if you want each line saved to the history list in bashhist.c:
bash_add_history() to be sent to syslog(). */
/* #define SYSLOG_HISTORY */
#if defined (SYSLOG_HISTORY)
# define SYSLOG_FACILITY LOG_USER
# define SYSLOG_LEVEL LOG_INFO
#endif
/* Define if you want to include code in shell.c to support wordexp(3) */
/* #define WORDEXP_OPTION */

View File

@ -115,6 +115,10 @@
pattern matching. */ pattern matching. */
#undef EXTENDED_GLOB #undef EXTENDED_GLOB
/* Define EXTGLOB_DEFAULT to the value you'd like the extglob shell option
to have by default */
#undef EXTGLOB_DEFAULT
/* Define COND_COMMAND if you want the ksh-style [[...]] conditional /* Define COND_COMMAND if you want the ksh-style [[...]] conditional
command. */ command. */
#undef COND_COMMAND #undef COND_COMMAND
@ -494,6 +498,8 @@
/* Define if you have the /dev/stdin device. */ /* Define if you have the /dev/stdin device. */
#undef HAVE_DEV_STDIN #undef HAVE_DEV_STDIN
/* The type of iconv's `inbuf' argument */
#undef ICONV_CONST
/* Type and behavior of signal handling functions. */ /* Type and behavior of signal handling functions. */
@ -608,6 +614,9 @@
/* Define if you have the getwd function. */ /* Define if you have the getwd function. */
#undef HAVE_GETWD #undef HAVE_GETWD
/* Define if you have the iconv function. */
#undef HAVE_ICONV
/* Define if you have the inet_aton function. */ /* Define if you have the inet_aton function. */
#undef HAVE_INET_ATON #undef HAVE_INET_ATON
@ -653,12 +662,21 @@
/* Define if you have the lstat function. */ /* Define if you have the lstat function. */
#undef HAVE_LSTAT #undef HAVE_LSTAT
/* Define if you have the locale_charset function. */
#undef HAVE_LOCALE_CHARSET
/* Define if you have the mbrlen function. */ /* Define if you have the mbrlen function. */
#undef HAVE_MBRLEN #undef HAVE_MBRLEN
/* Define if you have the mbrtowc function. */ /* Define if you have the mbrtowc function. */
#undef HAVE_MBRTOWC #undef HAVE_MBRTOWC
/* Define if you have the mbscasecmp function. */
#undef HAVE_MBSCASECMP
/* Define if you have the mbschr function. */
#undef HAVE_MBSCHR
/* Define if you have the mbscmp function. */ /* Define if you have the mbscmp function. */
#undef HAVE_MBSCMP #undef HAVE_MBSCMP
@ -738,6 +756,9 @@
/* Define if you have the strcasecmp function. */ /* Define if you have the strcasecmp function. */
#undef HAVE_STRCASECMP #undef HAVE_STRCASECMP
/* Define if you have the strcasestr function. */
#undef HAVE_STRCASESTR
/* Define if you have the strchr function. */ /* Define if you have the strchr function. */
#undef HAVE_STRCHR #undef HAVE_STRCHR
@ -786,6 +807,9 @@
/* Define if you have the sysconf function. */ /* Define if you have the sysconf function. */
#undef HAVE_SYSCONF #undef HAVE_SYSCONF
/* Define if you have the syslog function. */
#undef HAVE_SYSLOG
/* Define if you have the tcgetattr function. */ /* Define if you have the tcgetattr function. */
#undef HAVE_TCGETATTR #undef HAVE_TCGETATTR
@ -911,6 +935,9 @@
/* Define if you have the <stdint.h> header file. */ /* Define if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H #undef HAVE_STDINT_H
/* Define if you have the <syslog.h> header file. */
#undef HAVE_SYSLOG_H
/* Define if you have the <sys/dir.h> header file. */ /* Define if you have the <sys/dir.h> header file. */
#undef HAVE_SYS_DIR_H #undef HAVE_SYS_DIR_H

704
configure vendored
View File

@ -1,7 +1,7 @@
#! /bin/sh #! /bin/sh
# From configure.in for Bash 4.0, version 4.013. # From configure.in for Bash 4.1, version 4.019.
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.63 for bash 4.0-release. # Generated by GNU Autoconf 2.63 for bash 4.1-release.
# #
# Report bugs to <bug-bash@gnu.org>. # Report bugs to <bug-bash@gnu.org>.
# #
@ -597,8 +597,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package. # Identity of this package.
PACKAGE_NAME='bash' PACKAGE_NAME='bash'
PACKAGE_TARNAME='bash' PACKAGE_TARNAME='bash'
PACKAGE_VERSION='4.0-release' PACKAGE_VERSION='4.1-release'
PACKAGE_STRING='bash 4.0-release' PACKAGE_STRING='bash 4.1-release'
PACKAGE_BUGREPORT='bug-bash@gnu.org' PACKAGE_BUGREPORT='bug-bash@gnu.org'
ac_unique_file="shell.h" ac_unique_file="shell.h"
@ -819,6 +819,7 @@ enable_directory_stack
enable_disabled_builtins enable_disabled_builtins
enable_dparen_arithmetic enable_dparen_arithmetic
enable_extended_glob enable_extended_glob
enable_extended_glob_default
enable_help_builtin enable_help_builtin
enable_history enable_history
enable_job_control enable_job_control
@ -1410,7 +1411,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures bash 4.0-release to adapt to many kinds of systems. \`configure' configures bash 4.1-release to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1475,7 +1476,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of bash 4.0-release:";; short | recursive ) echo "Configuration of bash 4.1-release:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1510,6 +1511,9 @@ Optional Features:
--enable-dparen-arithmetic --enable-dparen-arithmetic
include ((...)) command include ((...)) command
--enable-extended-glob include ksh-style extended pattern matching --enable-extended-glob include ksh-style extended pattern matching
--enable-extended-glob-default
force extended pattern matching to be enabled by
default
--enable-help-builtin include the help builtin --enable-help-builtin include the help builtin
--enable-history turn on command history --enable-history turn on command history
--enable-job-control enable job control features --enable-job-control enable job control features
@ -1648,7 +1652,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
bash configure 4.0-release bash configure 4.1-release
generated by GNU Autoconf 2.63 generated by GNU Autoconf 2.63
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@ -1662,7 +1666,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by bash $as_me 4.0-release, which was It was created by bash $as_me 4.1-release, which was
generated by GNU Autoconf 2.63. Invocation command line was generated by GNU Autoconf 2.63. Invocation command line was
$ $0 $@ $ $0 $@
@ -1944,6 +1948,8 @@ ac_header_list="$ac_header_list unistd.h"
ac_func_list="$ac_func_list alarm" ac_func_list="$ac_func_list alarm"
ac_func_list="$ac_func_list fpurge" ac_func_list="$ac_func_list fpurge"
ac_func_list="$ac_func_list __fpurge" ac_func_list="$ac_func_list __fpurge"
ac_func_list="$ac_func_list snprintf"
ac_func_list="$ac_func_list vsnprintf"
# Check that the precious variables saved in the cache have kept the same # Check that the precious variables saved in the cache have kept the same
# value. # value.
ac_cache_corrupted=false ac_cache_corrupted=false
@ -2073,7 +2079,7 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var.
ac_config_headers="$ac_config_headers config.h" ac_config_headers="$ac_config_headers config.h"
BASHVERS=4.0 BASHVERS=4.1
RELSTATUS=release RELSTATUS=release
case "$RELSTATUS" in case "$RELSTATUS" in
@ -2412,6 +2418,7 @@ opt_debugger=yes
opt_single_longdoc_strings=yes opt_single_longdoc_strings=yes
opt_casemod_attrs=yes opt_casemod_attrs=yes
opt_casemod_expansions=yes opt_casemod_expansions=yes
opt_extglob_default=no
opt_static_link=no opt_static_link=no
opt_profiling=no opt_profiling=no
@ -2431,7 +2438,7 @@ if test $opt_minimal_config = yes; then
opt_extended_glob=no opt_cond_command=no opt_arith_for_command=no opt_extended_glob=no opt_cond_command=no opt_arith_for_command=no
opt_net_redirs=no opt_progcomp=no opt_separate_help=no opt_net_redirs=no opt_progcomp=no opt_separate_help=no
opt_multibyte=yes opt_cond_regexp=no opt_coproc=no opt_multibyte=yes opt_cond_regexp=no opt_coproc=no
opt_casemod_attrs=no opt_casemod_expansions=no opt_casemod_attrs=no opt_casemod_expansions=no opt_extglob_default=no
fi fi
# Check whether --enable-alias was given. # Check whether --enable-alias was given.
@ -2514,6 +2521,11 @@ if test "${enable_extended_glob+set}" = set; then
enableval=$enable_extended_glob; opt_extended_glob=$enableval enableval=$enable_extended_glob; opt_extended_glob=$enableval
fi fi
# Check whether --enable-extended-glob-default was given.
if test "${enable_extended_glob_default+set}" = set; then
enableval=$enable_extended_glob_default; opt_extglob_default=$enableval
fi
# Check whether --enable-help-builtin was given. # Check whether --enable-help-builtin was given.
if test "${enable_help_builtin+set}" = set; then if test "${enable_help_builtin+set}" = set; then
enableval=$enable_help_builtin; opt_help=$enableval enableval=$enable_help_builtin; opt_help=$enableval
@ -2702,6 +2714,17 @@ cat >>confdefs.h <<\_ACEOF
#define EXTENDED_GLOB 1 #define EXTENDED_GLOB 1
_ACEOF _ACEOF
fi
if test $opt_extglob_default = yes; then
cat >>confdefs.h <<\_ACEOF
#define EXTGLOB_DEFAULT 1
_ACEOF
else
cat >>confdefs.h <<\_ACEOF
#define EXTGLOB_DEFAULT 0
_ACEOF
fi fi
if test $opt_cond_command = yes ; then if test $opt_cond_command = yes ; then
cat >>confdefs.h <<\_ACEOF cat >>confdefs.h <<\_ACEOF
@ -11478,11 +11501,13 @@ done
for ac_header in unistd.h stdlib.h stdarg.h varargs.h limits.h string.h \ for ac_header in unistd.h stdlib.h stdarg.h varargs.h limits.h string.h \
memory.h locale.h termcap.h termio.h termios.h dlfcn.h \ memory.h locale.h termcap.h termio.h termios.h dlfcn.h \
stddef.h stdint.h netdb.h pwd.h grp.h strings.h regex.h stddef.h stdint.h netdb.h pwd.h grp.h strings.h regex.h \
syslog.h
do do
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
@ -13548,13 +13573,14 @@ done
for ac_func in bcopy bzero confstr fnmatch \ for ac_func in bcopy bzero confstr fnmatch \
getaddrinfo gethostbyname getservbyname getservent inet_aton \ getaddrinfo gethostbyname getservbyname getservent inet_aton \
memmove pathconf putenv raise regcomp regexec \ memmove pathconf putenv raise regcomp regexec \
setenv setlinebuf setlocale setvbuf siginterrupt strchr \ setenv setlinebuf setlocale setvbuf siginterrupt strchr \
sysconf tcgetattr times ttyname tzset unsetenv sysconf syslog tcgetattr times ttyname tzset unsetenv
do do
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
@ -13657,9 +13683,7 @@ done
for ac_func in vasprintf asprintf
for ac_func in vsnprintf snprintf vasprintf asprintf
do do
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
@ -13970,13 +13994,122 @@ done
for ac_func in getcwd memset
do
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
$as_echo_n "checking for $ac_func... " >&6; }
if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
$as_echo_n "(cached) " >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
For example, HP-UX 11i <limits.h> declares gettimeofday. */
#define $ac_func innocuous_$ac_func
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below.
Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
<limits.h> exists even on freestanding compilers. */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
#undef $ac_func
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char $ac_func ();
/* 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
#endif
int
main ()
{
return $ac_func ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_link") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
$as_test_x conftest$ac_exeext
}; then
eval "$as_ac_var=yes"
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
eval "$as_ac_var=no"
fi
rm -rf conftest.dSYM
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
conftest$ac_exeext conftest.$ac_ext
fi
ac_res=`eval 'as_val=${'$as_ac_var'}
$as_echo "$as_val"'`
{ $as_echo "$as_me:$LINENO: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
as_val=`eval 'as_val=${'$as_ac_var'}
$as_echo "$as_val"'`
if test "x$as_val" = x""yes; then
cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
else
case " $LIBOBJS " in
*" $ac_func.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS $ac_func.$ac_objext"
;;
esac
fi
done
for ac_func in getcwd memset strcasecmp strerror strftime strnlen strpbrk strstr
for ac_func in strcasecmp strcasestr strerror strftime strnlen strpbrk strstr
do do
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
@ -17128,6 +17261,98 @@ _ACEOF
fi fi
{ $as_echo "$as_me:$LINENO: checking for mbscasecmp" >&5
$as_echo_n "checking for mbscasecmp... " >&6; }
if test "${ac_cv_func_mbscasecmp+set}" = set; then
$as_echo_n "(cached) " >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Define mbscasecmp to an innocuous variant, in case <limits.h> declares mbscasecmp.
For example, HP-UX 11i <limits.h> declares gettimeofday. */
#define mbscasecmp innocuous_mbscasecmp
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char mbscasecmp (); below.
Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
<limits.h> exists even on freestanding compilers. */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
#undef mbscasecmp
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char mbscasecmp ();
/* 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_mbscasecmp || defined __stub___mbscasecmp
choke me
#endif
int
main ()
{
return mbscasecmp ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_link") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
$as_test_x conftest$ac_exeext
}; then
ac_cv_func_mbscasecmp=yes
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_func_mbscasecmp=no
fi
rm -rf conftest.dSYM
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
conftest$ac_exeext conftest.$ac_ext
fi
{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_mbscasecmp" >&5
$as_echo "$ac_cv_func_mbscasecmp" >&6; }
if test "x$ac_cv_func_mbscasecmp" = x""yes; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_MBSCMP 1
_ACEOF
fi
{ $as_echo "$as_me:$LINENO: checking for mbscmp" >&5 { $as_echo "$as_me:$LINENO: checking for mbscmp" >&5
$as_echo_n "checking for mbscmp... " >&6; } $as_echo_n "checking for mbscmp... " >&6; }
if test "${ac_cv_func_mbscmp+set}" = set; then if test "${ac_cv_func_mbscmp+set}" = set; then
@ -17313,6 +17538,116 @@ _ACEOF
fi fi
for ac_func in mbschr
do
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
$as_echo_n "checking for $ac_func... " >&6; }
if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
$as_echo_n "(cached) " >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
For example, HP-UX 11i <limits.h> declares gettimeofday. */
#define $ac_func innocuous_$ac_func
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below.
Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
<limits.h> exists even on freestanding compilers. */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
#undef $ac_func
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char $ac_func ();
/* 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
#endif
int
main ()
{
return $ac_func ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_link") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
$as_test_x conftest$ac_exeext
}; then
eval "$as_ac_var=yes"
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
eval "$as_ac_var=no"
fi
rm -rf conftest.dSYM
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
conftest$ac_exeext conftest.$ac_ext
fi
ac_res=`eval 'as_val=${'$as_ac_var'}
$as_echo "$as_val"'`
{ $as_echo "$as_me:$LINENO: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
as_val=`eval 'as_val=${'$as_ac_var'}
$as_echo "$as_val"'`
if test "x$as_val" = x""yes; then
cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
else
case " $LIBOBJS " in
*" $ac_func.$ac_objext "* ) ;;
*) LIBOBJS="$LIBOBJS $ac_func.$ac_objext"
;;
esac
fi
done
{ $as_echo "$as_me:$LINENO: checking for wcrtomb" >&5 { $as_echo "$as_me:$LINENO: checking for wcrtomb" >&5
$as_echo_n "checking for wcrtomb... " >&6; } $as_echo_n "checking for wcrtomb... " >&6; }
if test "${ac_cv_func_wcrtomb+set}" = set; then if test "${ac_cv_func_wcrtomb+set}" = set; then
@ -18201,6 +18536,113 @@ _ACEOF
fi fi
if test "$am_cv_func_iconv" = yes; then
OLDLIBS="$LIBS"
LIBS="$LIBS $LIBICONV"
for ac_func in locale_charset
do
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
$as_echo_n "checking for $ac_func... " >&6; }
if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
$as_echo_n "(cached) " >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
For example, HP-UX 11i <limits.h> declares gettimeofday. */
#define $ac_func innocuous_$ac_func
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func (); below.
Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
<limits.h> exists even on freestanding compilers. */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
#undef $ac_func
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char $ac_func ();
/* 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
#endif
int
main ()
{
return $ac_func ();
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_link") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest$ac_exeext && {
test "$cross_compiling" = yes ||
$as_test_x conftest$ac_exeext
}; then
eval "$as_ac_var=yes"
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
eval "$as_ac_var=no"
fi
rm -rf conftest.dSYM
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
conftest$ac_exeext conftest.$ac_ext
fi
ac_res=`eval 'as_val=${'$as_ac_var'}
$as_echo "$as_val"'`
{ $as_echo "$as_me:$LINENO: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
as_val=`eval 'as_val=${'$as_ac_var'}
$as_echo "$as_val"'`
if test "x$as_val" = x""yes; then
cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF
fi
done
LIBS="$OLDLIBS"
fi
if test "$opt_static_link" != yes; then if test "$opt_static_link" != yes; then
@ -26020,6 +26462,9 @@ cat >>conftest.$ac_ext <<_ACEOF
#if HAVE_INTTYPES_H #if HAVE_INTTYPES_H
#include <inttypes.h> #include <inttypes.h>
#endif #endif
#if HAVE_STDINT_H
#include <stdint.h>
#endif
#include <sys/times.h> #include <sys/times.h>
_ACEOF _ACEOF
@ -26064,6 +26509,9 @@ cat >>conftest.$ac_ext <<_ACEOF
#if HAVE_INTTYPES_H #if HAVE_INTTYPES_H
#include <inttypes.h> #include <inttypes.h>
#endif #endif
#if HAVE_STDINT_H
#include <stdint.h>
#endif
#include <signal.h> #include <signal.h>
_ACEOF _ACEOF
@ -26108,6 +26556,9 @@ cat >>conftest.$ac_ext <<_ACEOF
#if HAVE_INTTYPES_H #if HAVE_INTTYPES_H
#include <inttypes.h> #include <inttypes.h>
#endif #endif
#if HAVE_STDINT_H
#include <stdint.h>
#endif
_ACEOF _ACEOF
@ -26157,6 +26608,9 @@ cat >>conftest.$ac_ext <<_ACEOF
#if HAVE_INTTYPES_H #if HAVE_INTTYPES_H
#include <inttypes.h> #include <inttypes.h>
#endif #endif
#if HAVE_STDINT_H
#include <stdint.h>
#endif
_ACEOF _ACEOF
@ -26201,6 +26655,9 @@ cat >>conftest.$ac_ext <<_ACEOF
#if HAVE_INTTYPES_H #if HAVE_INTTYPES_H
#include <inttypes.h> #include <inttypes.h>
#endif #endif
#if HAVE_STDINT_H
#include <stdint.h>
#endif
_ACEOF _ACEOF
@ -26246,6 +26703,9 @@ cat >>conftest.$ac_ext <<_ACEOF
#if HAVE_INTTYPES_H #if HAVE_INTTYPES_H
#include <inttypes.h> #include <inttypes.h>
#endif #endif
#if HAVE_STDINT_H
#include <stdint.h>
#endif
#include <sys/socket.h> #include <sys/socket.h>
_ACEOF _ACEOF
@ -28224,6 +28684,212 @@ fi
if test X$ac_cv_func_snprintf = Xyes; then
{ $as_echo "$as_me:$LINENO: checking for standard-conformant snprintf" >&5
$as_echo_n "checking for standard-conformant snprintf... " >&6; }
if test "${bash_cv_func_snprintf+set}" = set; then
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then
{ $as_echo "$as_me:$LINENO: WARNING: cannot check standard snprintf if cross-compiling" >&5
$as_echo "$as_me: WARNING: cannot check standard snprintf if cross-compiling" >&2;}
bash_cv_func_snprintf=yes
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#include <stdio.h>
main()
{
int n;
n = snprintf (0, 0, "%s", "0123456");
exit(n != 7);
}
_ACEOF
rm -f conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_link") 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
{ (case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_try") 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
bash_cv_func_snprintf=yes
else
$as_echo "$as_me: program exited with status $ac_status" >&5
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
bash_cv_func_snprintf=no
fi
rm -rf conftest.dSYM
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
fi
{ $as_echo "$as_me:$LINENO: result: $bash_cv_func_snprintf" >&5
$as_echo "$bash_cv_func_snprintf" >&6; }
if test $bash_cv_func_snprintf = no; then
ac_cv_func_snprintf=no
fi
fi
if test $ac_cv_func_snprintf = no; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_SNPRINTF 0
_ACEOF
fi
if test X$ac_cv_func_vsnprintf = Xyes; then
{ $as_echo "$as_me:$LINENO: checking for standard-conformant vsnprintf" >&5
$as_echo_n "checking for standard-conformant vsnprintf... " >&6; }
if test "${bash_cv_func_vsnprintf+set}" = set; then
$as_echo_n "(cached) " >&6
else
if test "$cross_compiling" = yes; then
{ $as_echo "$as_me:$LINENO: WARNING: cannot check standard vsnprintf if cross-compiling" >&5
$as_echo "$as_me: WARNING: cannot check standard vsnprintf if cross-compiling" >&2;}
bash_cv_func_vsnprintf=yes
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
#if HAVE_STDARG_H
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#include <stdio.h>
#include <stdlib.h>
static int
#if HAVE_STDARG_H
foo(const char *fmt, ...)
#else
foo(format, va_alist)
const char *format;
va_dcl
#endif
{
va_list args;
int n;
#if HAVE_STDARG_H
va_start(args, fmt);
#else
va_start(args);
#endif
n = vsnprintf(0, 0, fmt, args);
va_end (args);
return n;
}
main()
{
int n;
n = foo("%s", "0123456");
exit(n != 7);
}
_ACEOF
rm -f conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_link") 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && { ac_try='./conftest$ac_exeext'
{ (case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_try") 2>&5
ac_status=$?
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); }; }; then
bash_cv_func_vsnprintf=yes
else
$as_echo "$as_me: program exited with status $ac_status" >&5
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
( exit $ac_status )
bash_cv_func_vsnprintf=no
fi
rm -rf conftest.dSYM
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
fi
fi
{ $as_echo "$as_me:$LINENO: result: $bash_cv_func_vsnprintf" >&5
$as_echo "$bash_cv_func_vsnprintf" >&6; }
if test $bash_cv_func_vsnprintf = no; then
ac_cv_func_vsnprintf=no
fi
fi
if test $ac_cv_func_vsnprintf = no; then
cat >>confdefs.h <<\_ACEOF
#define HAVE_VSNPRINTF 0
_ACEOF
fi
if test "$ac_cv_func_putenv" = "yes"; then if test "$ac_cv_func_putenv" = "yes"; then
@ -29971,7 +30637,7 @@ _ACEOF
*qnx*) LOCAL_CFLAGS="-Dqnx -F -3s" LOCAL_LDFLAGS="-3s" LOCAL_LIBS="-lunix -lncurses" ;; *qnx*) LOCAL_CFLAGS="-Dqnx -F -3s" LOCAL_LDFLAGS="-3s" LOCAL_LIBS="-lunix -lncurses" ;;
powerux*) LOCAL_LIBS="-lgen" ;; powerux*) LOCAL_LIBS="-lgen" ;;
cygwin*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;; cygwin*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
opennt*|interix*) LOCAL_CFLAGS="-DNO_MAIN_ENV_ARG -DBROKEN_DIRENT_D_INO -D_POSIX_SOURCE" ;; opennt*|interix*) LOCAL_CFLAGS="-DNO_MAIN_ENV_ARG -DBROKEN_DIRENT_D_INO -D_POSIX_SOURCE -D_ALL_SOURCE" ;;
esac esac
case "${host_os}-${CC}" in case "${host_os}-${CC}" in
@ -30504,7 +31170,7 @@ exec 6>&1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by bash $as_me 4.0-release, which was This file was extended by bash $as_me 4.1-release, which was
generated by GNU Autoconf 2.63. Invocation command line was generated by GNU Autoconf 2.63. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -30567,7 +31233,7 @@ Report bugs to <bug-autoconf@gnu.org>."
_ACEOF _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\ ac_cs_version="\\
bash config.status 4.0-release bash config.status 4.1-release
configured by $0, generated by GNU Autoconf 2.63, configured by $0, generated by GNU Autoconf 2.63,
with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"

View File

@ -1,5 +1,5 @@
dnl dnl
dnl Configure script for bash-4.0 dnl Configure script for bash-4.1
dnl dnl
dnl report bugs to chet@po.cwru.edu dnl report bugs to chet@po.cwru.edu
dnl dnl
@ -21,9 +21,9 @@ dnl Process this file with autoconf to produce a configure script.
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
AC_REVISION([for Bash 4.0, version 4.013])dnl AC_REVISION([for Bash 4.1, version 4.019])dnl
define(bashvers, 4.0) define(bashvers, 4.1)
define(relstatus, release) define(relstatus, release)
AC_INIT([bash], bashvers-relstatus, [bug-bash@gnu.org]) AC_INIT([bash], bashvers-relstatus, [bug-bash@gnu.org])
@ -185,6 +185,7 @@ opt_debugger=yes
opt_single_longdoc_strings=yes opt_single_longdoc_strings=yes
opt_casemod_attrs=yes opt_casemod_attrs=yes
opt_casemod_expansions=yes opt_casemod_expansions=yes
opt_extglob_default=no
dnl options that affect how bash is compiled and linked dnl options that affect how bash is compiled and linked
opt_static_link=no opt_static_link=no
@ -204,7 +205,7 @@ if test $opt_minimal_config = yes; then
opt_extended_glob=no opt_cond_command=no opt_arith_for_command=no opt_extended_glob=no opt_cond_command=no opt_arith_for_command=no
opt_net_redirs=no opt_progcomp=no opt_separate_help=no opt_net_redirs=no opt_progcomp=no opt_separate_help=no
opt_multibyte=yes opt_cond_regexp=no opt_coproc=no opt_multibyte=yes opt_cond_regexp=no opt_coproc=no
opt_casemod_attrs=no opt_casemod_expansions=no opt_casemod_attrs=no opt_casemod_expansions=no opt_extglob_default=no
fi fi
AC_ARG_ENABLE(alias, AC_HELP_STRING([--enable-alias], [enable shell aliases]), opt_alias=$enableval) AC_ARG_ENABLE(alias, AC_HELP_STRING([--enable-alias], [enable shell aliases]), opt_alias=$enableval)
@ -223,6 +224,7 @@ AC_ARG_ENABLE(directory-stack, AC_HELP_STRING([--enable-directory-stack], [enabl
AC_ARG_ENABLE(disabled-builtins, AC_HELP_STRING([--enable-disabled-builtins], [allow disabled builtins to still be invoked]), opt_disabled_builtins=$enableval) AC_ARG_ENABLE(disabled-builtins, AC_HELP_STRING([--enable-disabled-builtins], [allow disabled builtins to still be invoked]), opt_disabled_builtins=$enableval)
AC_ARG_ENABLE(dparen-arithmetic, AC_HELP_STRING([--enable-dparen-arithmetic], [include ((...)) command]), opt_dparen_arith=$enableval) AC_ARG_ENABLE(dparen-arithmetic, AC_HELP_STRING([--enable-dparen-arithmetic], [include ((...)) command]), opt_dparen_arith=$enableval)
AC_ARG_ENABLE(extended-glob, AC_HELP_STRING([--enable-extended-glob], [include ksh-style extended pattern matching]), opt_extended_glob=$enableval) AC_ARG_ENABLE(extended-glob, AC_HELP_STRING([--enable-extended-glob], [include ksh-style extended pattern matching]), opt_extended_glob=$enableval)
AC_ARG_ENABLE(extended-glob-default, AC_HELP_STRING([--enable-extended-glob-default], [force extended pattern matching to be enabled by default]), opt_extglob_default=$enableval)
AC_ARG_ENABLE(help-builtin, AC_HELP_STRING([--enable-help-builtin], [include the help builtin]), opt_help=$enableval) AC_ARG_ENABLE(help-builtin, AC_HELP_STRING([--enable-help-builtin], [include the help builtin]), opt_help=$enableval)
AC_ARG_ENABLE(history, AC_HELP_STRING([--enable-history], [turn on command history]), opt_history=$enableval) AC_ARG_ENABLE(history, AC_HELP_STRING([--enable-history], [turn on command history]), opt_history=$enableval)
AC_ARG_ENABLE(job-control, AC_HELP_STRING([--enable-job-control], [enable job control features]), opt_job_control=$enableval) AC_ARG_ENABLE(job-control, AC_HELP_STRING([--enable-job-control], [enable job control features]), opt_job_control=$enableval)
@ -296,6 +298,11 @@ fi
if test $opt_extended_glob = yes ; then if test $opt_extended_glob = yes ; then
AC_DEFINE(EXTENDED_GLOB) AC_DEFINE(EXTENDED_GLOB)
fi fi
if test $opt_extglob_default = yes; then
AC_DEFINE(EXTGLOB_DEFAULT, 1)
else
AC_DEFINE(EXTGLOB_DEFAULT, 0)
fi
if test $opt_cond_command = yes ; then if test $opt_cond_command = yes ; then
AC_DEFINE(COND_COMMAND) AC_DEFINE(COND_COMMAND)
fi fi
@ -500,8 +507,8 @@ then
case "$ac_cv_rl_version" in case "$ac_cv_rl_version" in
5*|6*|7*|8*|9*) ;; 5*|6*|7*|8*|9*) ;;
*) opt_with_installed_readline=no *) opt_with_installed_readline=no
AC_MSG_WARN(installed readline library is too old to be linked with bash) AC_MSG_WARN([installed readline library is too old to be linked with bash])
AC_MSG_WARN(using private bash version) AC_MSG_WARN([using private bash version])
;; ;;
esac esac
fi fi
@ -651,7 +658,8 @@ BASH_HEADER_INTTYPES
AC_CHECK_HEADERS(unistd.h stdlib.h stdarg.h varargs.h limits.h string.h \ 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 \ memory.h locale.h termcap.h termio.h termios.h dlfcn.h \
stddef.h stdint.h netdb.h pwd.h grp.h strings.h regex.h) stddef.h stdint.h netdb.h pwd.h grp.h strings.h regex.h \
syslog.h)
AC_CHECK_HEADERS(sys/pte.h sys/stream.h sys/select.h sys/file.h \ AC_CHECK_HEADERS(sys/pte.h sys/stream.h sys/select.h sys/file.h \
sys/resource.h sys/param.h sys/socket.h sys/stat.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) sys/time.h sys/times.h sys/types.h sys/wait.h)
@ -723,12 +731,13 @@ AC_CHECK_FUNCS(bcopy bzero confstr fnmatch \
getaddrinfo gethostbyname getservbyname getservent inet_aton \ getaddrinfo gethostbyname getservbyname getservent inet_aton \
memmove pathconf putenv raise regcomp regexec \ memmove pathconf putenv raise regcomp regexec \
setenv setlinebuf setlocale setvbuf siginterrupt strchr \ setenv setlinebuf setlocale setvbuf siginterrupt strchr \
sysconf tcgetattr times ttyname tzset unsetenv) sysconf syslog tcgetattr times ttyname tzset unsetenv)
AC_CHECK_FUNCS(vsnprintf snprintf vasprintf asprintf) AC_CHECK_FUNCS(vasprintf asprintf)
AC_CHECK_FUNCS(isascii isblank isgraph isprint isspace isxdigit) AC_CHECK_FUNCS(isascii isblank isgraph isprint isspace isxdigit)
AC_CHECK_FUNCS(getpwent getpwnam getpwuid) AC_CHECK_FUNCS(getpwent getpwnam getpwuid)
AC_REPLACE_FUNCS(getcwd memset strcasecmp strerror strftime strnlen strpbrk strstr) AC_REPLACE_FUNCS(getcwd memset)
AC_REPLACE_FUNCS(strcasecmp strcasestr strerror strftime strnlen strpbrk strstr)
AC_REPLACE_FUNCS(strtod strtol strtoul strtoll strtoull strtoimax strtoumax) AC_REPLACE_FUNCS(strtod strtol strtoul strtoll strtoull strtoimax strtoumax)
AC_REPLACE_FUNCS(fdprintf) AC_REPLACE_FUNCS(fdprintf)
@ -919,6 +928,8 @@ BASH_FUNC_GETCWD
fi fi
BASH_FUNC_POSIX_SETJMP BASH_FUNC_POSIX_SETJMP
BASH_FUNC_STRCOLL BASH_FUNC_STRCOLL
BASH_FUNC_SNPRINTF
BASH_FUNC_VSNPRINTF
dnl If putenv or unsetenv is not present, set the right define so the dnl If putenv or unsetenv is not present, set the right define so the
dnl prototype and declaration in lib/sh/getenv.c will be standard-conformant dnl prototype and declaration in lib/sh/getenv.c will be standard-conformant
@ -1025,7 +1036,7 @@ linux*) LOCAL_LDFLAGS=-rdynamic # allow dynamic loading
*qnx*) LOCAL_CFLAGS="-Dqnx -F -3s" LOCAL_LDFLAGS="-3s" LOCAL_LIBS="-lunix -lncurses" ;; *qnx*) LOCAL_CFLAGS="-Dqnx -F -3s" LOCAL_LDFLAGS="-3s" LOCAL_LIBS="-lunix -lncurses" ;;
powerux*) LOCAL_LIBS="-lgen" ;; powerux*) LOCAL_LIBS="-lgen" ;;
cygwin*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;; cygwin*) LOCAL_CFLAGS=-DRECYCLES_PIDS ;;
opennt*|interix*) LOCAL_CFLAGS="-DNO_MAIN_ENV_ARG -DBROKEN_DIRENT_D_INO -D_POSIX_SOURCE" ;; opennt*|interix*) LOCAL_CFLAGS="-DNO_MAIN_ENV_ARG -DBROKEN_DIRENT_D_INO -D_POSIX_SOURCE -D_ALL_SOURCE" ;;
esac esac
dnl Stanza for OS/compiler pair-specific flags dnl Stanza for OS/compiler pair-specific flags

View File

@ -113,7 +113,15 @@ copy_redirect (redirect)
REDIRECT *new_redirect; REDIRECT *new_redirect;
new_redirect = (REDIRECT *)xmalloc (sizeof (REDIRECT)); new_redirect = (REDIRECT *)xmalloc (sizeof (REDIRECT));
#if 0
FASTCOPY ((char *)redirect, (char *)new_redirect, (sizeof (REDIRECT))); FASTCOPY ((char *)redirect, (char *)new_redirect, (sizeof (REDIRECT)));
#else
*new_redirect = *redirect; /* let the compiler do the fast structure copy */
#endif
if (redirect->rflags & REDIR_VARASSIGN)
new_redirect->redirector.filename = copy_word (redirect->redirector.filename);
switch (redirect->instruction) switch (redirect->instruction)
{ {
case r_reading_until: case r_reading_until:

View File

@ -309,6 +309,10 @@ dispose_redirects (list)
{ {
t = list; t = list;
list = list->next; list = list->next;
if (t->rflags & REDIR_VARASSIGN)
dispose_word (t->redirector.filename);
switch (t->instruction) switch (t->instruction)
{ {
case r_reading_until: case r_reading_until:

215
doc/FAQ
View File

@ -1,4 +1,4 @@
This is the Bash FAQ, version 4.01, for Bash version 4.0. This is the Bash FAQ, version 4.11, for Bash version 4.1.
This document contains a set of frequently-asked questions concerning This document contains a set of frequently-asked questions concerning
Bash, the GNU Bourne-Again Shell. Bash is a freely-available command Bash, the GNU Bourne-Again Shell. Bash is a freely-available command
@ -36,9 +36,9 @@ A10) What is the bash `posix mode'?
Section B: The latest version Section B: The latest version
B1) What's new in version 4.0? B1) What's new in version 4.1?
B2) Are there any user-visible incompatibilities between bash-4.0, B2) Are there any user-visible incompatibilities between bash-4.1 and
bash-3.2, and bash-2.05b? previous bash versions?
Section C: Differences from other Unix shells Section C: Differences from other Unix shells
@ -81,6 +81,7 @@ E12) Why don't negative offsets in substring expansion work like I expect?
E13) Why does filename completion misbehave if a colon appears in the filename? E13) Why does filename completion misbehave if a colon appears in the filename?
E14) Why does quoting the pattern argument to the regular expression matching E14) Why does quoting the pattern argument to the regular expression matching
conditional operator (=~) cause matching to stop working? conditional operator (=~) cause matching to stop working?
E15) Tell me more about the shell compatibility level.
Section F: Things to watch out for on certain Unix versions Section F: Things to watch out for on certain Unix versions
@ -143,26 +144,26 @@ of Case Western Reserve University.
A2) What's the latest version? A2) What's the latest version?
The latest version is 4.0, first made available on 20 February, 2009. The latest version is 4.1, first made available on 31 December, 2009.
A3) Where can I get it? A3) Where can I get it?
Bash is the GNU project's shell, and so is available from the Bash is the GNU project's shell, and so is available from the
master GNU archive site, ftp.gnu.org, and its mirrors. The master GNU archive site, ftp.gnu.org, and its mirrors. The
latest version is also available for FTP from ftp.cwru.edu. latest version is also available for FTP from ftp.cwru.edu.
The following URLs tell how to get version 4.0: The following URLs tell how to get version 4.1:
ftp://ftp.gnu.org/pub/gnu/bash/bash-4.0.tar.gz ftp://ftp.gnu.org/pub/gnu/bash/bash-4.1.tar.gz
ftp://ftp.cwru.edu/pub/bash/bash-4.0.tar.gz ftp://ftp.cwru.edu/pub/bash/bash-4.1.tar.gz
Formatted versions of the documentation are available with the URLs: Formatted versions of the documentation are available with the URLs:
ftp://ftp.gnu.org/pub/gnu/bash/bash-doc-4.0.tar.gz ftp://ftp.gnu.org/pub/gnu/bash/bash-doc-4.1.tar.gz
ftp://ftp.cwru.edu/pub/bash/bash-doc-4.0.tar.gz ftp://ftp.cwru.edu/pub/bash/bash-doc-4.1.tar.gz
Any patches for the current version are available with the URL: Any patches for the current version are available with the URL:
ftp://ftp.cwru.edu/pub/bash/bash-4.0-patches/ ftp://ftp.cwru.edu/pub/bash/bash-4.1-patches/
A4) On what machines will bash run? A4) On what machines will bash run?
@ -194,7 +195,7 @@ http://www.cygwin.com/.
Cygnus originally ported bash-1.14.7, and that port was part of their 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 early GNU-Win32 (the original name) releases. Cygnus has also done
ports of bash-2.05b and bash-3.2 to the CYGWIN environment, and both ports of bash-3.2 and bash-4.0 to the CYGWIN environment, and both
are available as part of their current release. are available as part of their current release.
Bash-2.05b and later versions should require no local Cygnus changes to Bash-2.05b and later versions should require no local Cygnus changes to
@ -218,7 +219,7 @@ Mark began to work with bash-2.05, but I don't know the current status.
Bash-3.0 compiles and runs with no modifications under Microsoft's Services Bash-3.0 compiles and runs with no modifications under Microsoft's Services
for Unix (SFU), once known as Interix. I do not anticipate any problems for Unix (SFU), once known as Interix. I do not anticipate any problems
with building bash-4.0, but will gladly accept any patches that are needed. with building bash-4.1, but will gladly accept any patches that are needed.
A6) How can I build bash with gcc? A6) How can I build bash with gcc?
@ -387,16 +388,124 @@ They are also listed in a section in the Bash Reference Manual
Section B: The latest version Section B: The latest version
B1) What's new in version 4.0? B1) What's new in version 4.1?
Bash-4.0 is the fourth major release of bash. There are numerous new features, Bash-4.1 is the first revision to the fourth major release of bash.
some experimental. Depending on community reception, the experimental
features will evolve.
Bash-4.0 contains the following new features (see the manual page for Bash-4.1 contains the following new features (see the manual page for
complete descriptions and the CHANGES and NEWS files in the bash-4.0 complete descriptions and the CHANGES and NEWS files in the bash-4.1
distribution): distribution):
o Here-documents within $(...) command substitutions may once more be
delimited by the closing right paren, instead of requiring a newline.
o Bash's file status checks (executable, readable, etc.) now take file
system ACLs into account on file systems that support them.
o Bash now passes environment variables with names that are not valid
shell variable names through into the environment passed to child
processes.
o The `execute-unix-command' readline function now attempts to clear and
reuse the current line rather than move to a new one after the command
executes.
o `printf -v' can now assign values to array indices.
o New `complete -E' and `compopt -E' options that work on the "empty"
completion: completion attempted on an empty command line.
o New complete/compgen/compopt -D option to define a `default' completion:
a completion to be invoked on command for which no completion has been
defined. If this function returns 124, programmable completion is
attempted again, allowing a user to dynamically build a set of completions
as completion is attempted by having the default completion function
install individual completion functions each time it is invoked.
o When displaying associative arrays, subscripts are now quoted.
o Changes to dabbrev-expand to make it more `emacs-like': no space appended
after matches, completions are not sorted, and most recent history entries
are presented first.
o The [[ and (( commands are now subject to the setting of `set -e' and the
ERR trap.
o The source/. builtin now removes NUL bytes from the file before attempting
to parse commands.
o There is a new configuration option (in config-top.h) that forces bash to
forward all history entries to syslog.
o A new variable $BASHOPTS to export shell options settable using `shopt' to
child processes.
o There is a new confgure option that forces the extglob option to be
enabled by default.
o New variable $BASH_XTRACEFD; when set to an integer bash will write xtrace
output to that file descriptor.
o If the optional left-hand-side of a redirection is of the form {var}, the
shell assigns the file descriptor used to $var or uses $var as the file
descriptor to move or close, depending on the redirection operator.
o The < and > operators to the [[ conditional command now do string
comparison according to the current locale.
o Programmable completion now uses the completion for `b' instead of `a'
when completion is attempted on a line like: a $(b c.
o Force extglob on temporarily when parsing the pattern argument to
the == and != operators to the [[ command, for compatibility.
o Changed the behavior of interrupting the wait builtin when a SIGCHLD is
received and a trap on SIGCHLD is set to be Posix-mode only.
o The read builtin has a new `-N nchars' option, which reads exactly NCHARS
characters, ignoring delimiters like newline.
o The mapfile/readarray builtin no longer stores the commands it invokes via
callbacks in the history list.
o There is a new `compat40' shopt option.
o The < and > operators to [[ do string comparisons using the current locale
only if the compatibility level is greater than 40 (set to 41 by default).
o New bindable readline function: menu-complete-backward.
o In the readline vi-mode insertion keymap, C-n is now bound to menu-complete
by default, and C-p to menu-complete-backward.
o When in readline vi command mode, repeatedly hitting ESC now does nothing,
even when ESC introduces a bound key sequence. This is closer to how
historical vi behaves.
o New bindable readline function: skip-csi-sequence. Can be used as a
default to consume key sequences generated by keys like Home and End
without having to bind all keys.
o New bindable readline variable: skip-completed-text, active when
completing in the middle of a word. If enabled, it means that characters
in the completion that match characters in the remainder of the word are
"skipped" rather than inserted into the line.
o The pre-readline-6.0 version of menu completion is available as
"old-menu-complete" for users who do not like the readline-6.0 version.
o New bindable readline variable: echo-control-characters. If enabled, and
the tty ECHOCTL bit is set, controls the echoing of characters
corresponding to keyboard-generated signals.
o New bindable readline variable: enable-meta-key. Controls whether or not
readline sends the smm/rmm sequences if the terminal indicates it has a
meta key that enables eight-bit characters.
A short feature history dating from Bash-2.0:
Bash-4.0 contained the following new features:
o When using substring expansion on the positional parameters, a starting o When using substring expansion on the positional parameters, a starting
index of 0 now causes $0 to be prefixed to the list. index of 0 now causes $0 to be prefixed to the list.
@ -536,8 +645,6 @@ o New bindable readline functions shell-backward-kill-word and shell-kill-word
which kill words backward and forward, but use the same word boundaries which kill words backward and forward, but use the same word boundaries
as shell-forward-word and shell-backward-word. as shell-forward-word and shell-backward-word.
A short feature history dating from Bash-2.0:
Bash-3.2 contained the following new features: Bash-3.2 contained the following new features:
o Bash-3.2 now checks shell scripts for NUL characters rather than non-printing o Bash-3.2 now checks shell scripts for NUL characters rather than non-printing
@ -794,13 +901,14 @@ grammar tighter and smaller (66 reduce-reduce conflicts gone)
lots of code now smaller and faster lots of code now smaller and faster
test suite greatly expanded test suite greatly expanded
B2) Are there any user-visible incompatibilities between bash-4.0, bash-3.2, B2) Are there any user-visible incompatibilities between bash-4.1 and
and bash-2.05b? previous bash versions?
There are a few incompatibilities between version 4.0 and version 3.2. There are a few incompatibilities between version 4.1 and previous
They are detailed in the file COMPAT in the bash distribution. That file versions. They are detailed in the file COMPAT in the bash distribution.
is not meant to be all-encompassing; send mail to bash-maintainers@gnu.org That file is not meant to be all-encompassing; send mail to
if if you find something that's not mentioned there. bash-maintainers@gnu.org (or bug-bash@gnu.org if you would like
community discussion) if if you find something that's not mentioned there.
Section C: Differences from other Unix shells Section C: Differences from other Unix shells
@ -837,7 +945,7 @@ Things bash has that sh does not:
HISTFILESIZE, HISTCONTROL, HISTIGNORE, GLOBIGNORE, GROUPS, HISTFILESIZE, HISTCONTROL, HISTIGNORE, GLOBIGNORE, GROUPS,
PROMPT_COMMAND, FCEDIT, FIGNORE, IGNOREEOF, INPUTRC, PROMPT_COMMAND, FCEDIT, FIGNORE, IGNOREEOF, INPUTRC,
SHELLOPTS, OPTERR, HOSTFILE, TMOUT, FUNCNAME, histchars, SHELLOPTS, OPTERR, HOSTFILE, TMOUT, FUNCNAME, histchars,
auto_resume, PROMPT_DIRTRIM auto_resume, PROMPT_DIRTRIM, BASHOPTS, BASH_XTRACEFD
DEBUG trap DEBUG trap
ERR trap ERR trap
variable arrays with new compound assignment syntax variable arrays with new compound assignment syntax
@ -848,7 +956,7 @@ Things bash has that sh does not:
bash return builtin will exit a file sourced with `.' 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. 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, export -n/-f/-p/name=value, pwd -L/-P,
read -e/-p/-a/-t/-n/-d/-s/-u/-i, read -e/-p/-a/-t/-n/-d/-s/-u/-i/-N,
readonly -a/-f/name=value, trap -l, set +o, readonly -a/-f/name=value, trap -l, set +o,
set -b/-m/-o option/-h/-p/-B/-C/-H/-P, set -b/-m/-o option/-h/-p/-B/-C/-H/-P,
unset -f/-v, ulimit -i/-m/-p/-q/-u/-x, unset -f/-v, ulimit -i/-m/-p/-q/-u/-x,
@ -894,6 +1002,7 @@ Things bash has that sh does not:
case-modifying word expansions and variable attributes case-modifying word expansions and variable attributes
associative arrays associative arrays
coprocesses using the `coproc' reserved word and variables coprocesses using the `coproc' reserved word and variables
shell assignment of a file descriptor used in a redirection to a variable
Things sh has that bash does not: Things sh has that bash does not:
uses variable SHACCT to do shell accounting uses variable SHACCT to do shell accounting
@ -950,7 +1059,7 @@ Things bash has or uses that ksh88 does not:
builtins: bind, builtin, command, declare, dirs, echo -e/-E, enable, builtins: bind, builtin, command, declare, dirs, echo -e/-E, enable,
exec -l/-c/-a, fc -s, export -n/-f/-p, hash, help, history, 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, 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, read -e/-p/-a/-t/-n/-d/-s/-N, readonly -a/-n/-f/-p,
set -o braceexpand/-o histexpand/-o interactive-comments/ set -o braceexpand/-o histexpand/-o interactive-comments/
-o notify/-o physical/-o posix/-o hashall/-o onecmd/ -o notify/-o physical/-o posix/-o hashall/-o onecmd/
-h/-B/-C/-b/-H/-P, set +o, suspend, trap -l, type, -h/-B/-C/-b/-H/-P, set +o, suspend, trap -l, type,
@ -979,6 +1088,7 @@ Things bash has or uses that ksh88 does not:
case-modifying word expansions and variable attributes case-modifying word expansions and variable attributes
associative arrays associative arrays
coprocesses using the `coproc' reserved word and variables coprocesses using the `coproc' reserved word and variables
shell assignment of a file descriptor used in a redirection to a variable
Things ksh88 has or uses that bash does not: Things ksh88 has or uses that bash does not:
tracked aliases (alias -t) tracked aliases (alias -t)
@ -1006,9 +1116,9 @@ Implementation differences:
C3) Which new features in ksh-93 are not in bash, and which are? C3) Which new features in ksh-93 are not in bash, and which are?
This list is current through ksh93t (11/04/2008) This list is current through ksh93t+ (05/05/2009)
New things in ksh-93 not in bash-4.0: New things in ksh-93 not in bash-4.1:
floating point arithmetic and variables floating point arithmetic and variables
math library functions math library functions
${!name[sub]} name of subscript for associative array ${!name[sub]} name of subscript for associative array
@ -1031,10 +1141,11 @@ New things in ksh-93 not in bash-4.0:
`.' can execute shell functions `.' can execute shell functions
getopts -a getopts -a
printf %B, %H, %P, %R, %T, %Z modifiers, output base for %d, `=' flag printf %B, %H, %P, %R, %T, %Z modifiers, output base for %d, `=' flag
read -N (read -n differs, too)/-v read -n/-N differ/-v
set -o showme/-o multiline (bash default) set -o showme/-o multiline (bash default)
`sleep' and `getconf' builtins (bash has loadable versions) `sleep' and `getconf' builtins (bash has loadable versions)
typeset -n and `nameref' variables typeset -n and `nameref' variables
[[ -R name ]] (checks whether or not name is a nameref)
typeset -C/-S/-T/-X/-h/-s typeset -C/-S/-T/-X/-h/-s
experimental `type' definitions (a la typedef) using typeset experimental `type' definitions (a la typedef) using typeset
negative subscripts for indexed array variables negative subscripts for indexed array variables
@ -1042,11 +1153,11 @@ New things in ksh-93 not in bash-4.0:
associative array assignments using `;' as element separator associative array assignments using `;' as element separator
command substitution $(n<#) expands to current byte offset for fd N command substitution $(n<#) expands to current byte offset for fd N
new '${ ' form of command substitution, executed in current shell new '${ ' form of command substitution, executed in current shell
new >;/<#pat/<##pat/<#/># redirections new >;/<>;/<#pat/<##pat/<#/># redirections
redirection operators preceded with {varname} to store fd number in varname
brace expansion printf-like formats brace expansion printf-like formats
[[ -v var ]] operators (checks whether or not var is set)
New things in ksh-93 present in bash-4.0: New things in ksh-93 present in bash-4.1:
associative arrays associative arrays
[n]<&word- and [n]>&word- redirections (combination dup and close) [n]<&word- and [n]>&word- redirections (combination dup and close)
for (( expr1; expr2; expr3 )) ; do list; done - arithmetic for command for (( expr1; expr2; expr3 )) ; do list; done - arithmetic for command
@ -1080,6 +1191,8 @@ New things in ksh-93 present in bash-4.0:
the `;&' case statement "fallthrough" pattern list terminator the `;&' case statement "fallthrough" pattern list terminator
csh-style history expansion and set -H csh-style history expansion and set -H
negative offsets in ${param:offset:length} negative offsets in ${param:offset:length}
redirection operators preceded with {varname} to store fd number in varname
DEBUG can force skipping following command
Section D: Why does bash do some things differently than other Unix shells? Section D: Why does bash do some things differently than other Unix shells?
@ -1641,6 +1754,32 @@ several options to the `shopt' builtin. If the `compat31' option is enabled,
bash reverts to the bash-3.1 behavior with respect to quoting the rhs of bash reverts to the bash-3.1 behavior with respect to quoting the rhs of
the =~ operator. the =~ operator.
E15) Tell me more about the shell compatibility level.
Bash-4.0 introduced the concept of a `shell compatibility level', specified
as a set of options to the shopt builtin (compat31, compat32, compat40 at
this writing). There is only one current compatibility level -- each
option is mutually exclusive. This list does not mention behavior that is
standard for a particular version (e.g., setting compat32 means that quoting
the rhs of the regexp matching operator quotes special regexp characters in
the word, which is default behavior in bash-3.2 and above).
compat31 set
- the < and > operators to the [[ command do not consider the current
locale when comparing strings
- quoting the rhs of the regexp matching operator (=~) has no
special effect
compat32 set
- the < and > operators to the [[ command do not consider the current
locale when comparing strings
compat40 set
- the < and > operators to the [[ command do not consider the current
locale when comparing strings
- interrupting a command list such as "a ; b ; c" causes the execution
of the entire list to be aborted
Section F: Things to watch out for on certain Unix versions Section F: Things to watch out for on certain Unix versions
F1) Why can't I use command line editing in my `cmdtool'? F1) Why can't I use command line editing in my `cmdtool'?
@ -2049,9 +2188,9 @@ Some of the new ksh93 pattern matching operators, like backreferencing
H5) When will the next release appear? H5) When will the next release appear?
The next version will appear sometime in 2009. Never make predictions. The next version will appear sometime in 2010. Never make predictions.
This document is Copyright 1995-2009 by Chester Ramey. This document is Copyright 1995-2010 by Chester Ramey.
Permission is hereby granted, without written agreement and Permission is hereby granted, without written agreement and
without license or royalty fees, to use, copy, and distribute without license or royalty fees, to use, copy, and distribute

View File

@ -94,7 +94,7 @@ GROFF = groff
HSUSER = $(RL_LIBDIR)/doc/hsuser.texi HSUSER = $(RL_LIBDIR)/doc/hsuser.texi
RLUSER = $(RL_LIBDIR)/doc/rluser.texi RLUSER = $(RL_LIBDIR)/doc/rluser.texi
BASHREF_FILES = $(srcdir)/bashref.texi $(srcdir)/version.texi BASHREF_FILES = $(srcdir)/bashref.texi $(srcdir)/fdl.texi $(srcdir)/version.texi
.SUFFIXES: .0 .1 .3 .ms .ps .txt .dvi .html .pdf .SUFFIXES: .0 .1 .3 .ms .ps .txt .dvi .html .pdf

2295
doc/bash.0

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

12518
doc/bash.ps

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -24,7 +24,7 @@ are preserved on all copies.
@quotation @quotation
Permission is granted to copy, distribute and/or modify this document Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 or under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no any later version published by the Free Software Foundation; with no
Invariant Sections, with the Front-Cover texts being ``A GNU Manual'', 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 and with the Back-Cover Texts as in (a) below. A copy of the license is
@ -498,6 +498,7 @@ alert (bell)
@item \b @item \b
backspace backspace
@item \e @item \e
@itemx \E
an escape character (not ANSI C) an escape character (not ANSI C)
@item \f @item \f
form feed form feed
@ -513,6 +514,8 @@ vertical tab
backslash backslash
@item \' @item \'
single quote single quote
@item \"
double quote
@item \@var{nnn} @item \@var{nnn}
the eight-bit character whose value is the octal value @var{nnn} the eight-bit character whose value is the octal value @var{nnn}
(one to three digits) (one to three digits)
@ -777,7 +780,7 @@ in @var{consequent-commands}, or zero if none was executed.
The syntax of the @code{for} command is: The syntax of the @code{for} command is:
@example @example
for @var{name} [in @var{words} @dots{}]; do @var{commands}; done for @var{name} [ [in [@var{words} @dots{}] ] ; ] do @var{commands}; done
@end example @end example
Expand @var{words}, and execute @var{commands} once for each member Expand @var{words}, and execute @var{commands} once for each member
in the resultant list, with @var{name} bound to the current member. in the resultant list, with @var{name} bound to the current member.
@ -864,7 +867,7 @@ operator terminates a pattern list.
A list of patterns and an associated command-list is known A list of patterns and an associated command-list is known
as a @var{clause}. as a @var{clause}.
Each clause must be terminated with @samp{;;}, @samp{,&}, or @samp{;;&}. Each clause must be terminated with @samp{;;}, @samp{;&}, or @samp{;;&}.
The @var{word} undergoes tilde expansion, parameter expansion, command The @var{word} undergoes tilde expansion, parameter expansion, command
substitution, arithmetic expansion, and quote removal before matching is substitution, arithmetic expansion, and quote removal before matching is
attempted. Each @var{pattern} undergoes tilde expansion, parameter attempted. Each @var{pattern} undergoes tilde expansion, parameter
@ -976,6 +979,9 @@ substitution, and quote removal are performed.
Conditional operators such as @samp{-f} must be unquoted to be recognized Conditional operators such as @samp{-f} must be unquoted to be recognized
as primaries. as primaries.
When used with @samp{[[}, The @samp{<} and @samp{>} operators sort
lexicographically using the current locale.
When the @samp{==} and @samp{!=} operators are used, the string to the When the @samp{==} and @samp{!=} operators are used, the string to the
right of the operator is considered a pattern and matched according right of the operator is considered a pattern and matched according
to the rules described below in @ref{Pattern Matching}. to the rules described below in @ref{Pattern Matching}.
@ -1177,14 +1183,18 @@ positional parameters is updated to reflect the change.
Special parameter @code{0} is unchanged. Special parameter @code{0} is unchanged.
The first element of the @env{FUNCNAME} variable is set to the The first element of the @env{FUNCNAME} variable is set to the
name of the function while the function is executing. name of the function while the function is executing.
All other aspects of the shell execution All other aspects of the shell execution
environment are identical between a function and its caller environment are identical between a function and its caller
with the exception that the @env{DEBUG} and @env{RETURN} traps with these exceptions:
the @env{DEBUG} and @env{RETURN} traps
are not inherited unless the function has been given the are not inherited unless the function has been given the
@code{trace} attribute using the @code{declare} builtin or @code{trace} attribute using the @code{declare} builtin or
the @code{-o functrace} option has been enabled with the @code{-o functrace} option has been enabled with
the @code{set} builtin, the @code{set} builtin,
(in which case all functions inherit the @env{DEBUG} and @env{RETURN} traps). (in which case all functions inherit the @env{DEBUG} and @env{RETURN} traps),
and the @env{ERR} trap is not inherited unless the @code{-o errtrace}
shell option has been enabled.
@xref{Bourne Shell Builtins}, for the description of the @xref{Bourne Shell Builtins}, for the description of the
@code{trap} builtin. @code{trap} builtin.
@ -1461,7 +1471,7 @@ bash$ echo a@{d,c,b@}e
ade ace abe ade ace abe
@end example @end example
A sequence expression takes the form @code{@{@var{x}..@var{y}[@var{incr}]@}}, A sequence expression takes the form @code{@{@var{x}..@var{y}[..@var{incr}]@}},
where @var{x} and @var{y} are either integers or single characters, where @var{x} and @var{y} are either integers or single characters,
and @var{incr}, an optional increment, is an integer. and @var{incr}, an optional increment, is an integer.
When integers are supplied, the expression expands to each number between When integers are supplied, the expression expands to each number between
@ -1601,7 +1611,7 @@ or when @var{parameter}
is followed by a character that is not to be is followed by a character that is not to be
interpreted as part of its name. interpreted as part of its name.
If the first character of @var{parameter} is an exclamation point, If the first character of @var{parameter} is an exclamation point (!),
a level of variable indirection is introduced. a level of variable indirection is introduced.
Bash uses the value of the variable formed from the rest of Bash uses the value of the variable formed from the rest of
@var{parameter} as the name of the variable; this variable is then @var{parameter} as the name of the variable; this variable is then
@ -1767,7 +1777,7 @@ array in turn, and the expansion is the resultant list.
@itemx $@{@var{parameter},,@var{pattern}@} @itemx $@{@var{parameter},,@var{pattern}@}
This expansion modifies the case of alphabetic characters in @var{parameter}. This expansion modifies the case of alphabetic characters in @var{parameter}.
The @var{pattern} is expanded to produce a pattern just as in The @var{pattern} is expanded to produce a pattern just as in
pathname expansion. filename expansion.
The @samp{^} operator converts lowercase letters matching @var{pattern} The @samp{^} operator converts lowercase letters matching @var{pattern}
to uppercase; the @samp{,} operator converts matching uppercase letters to uppercase; the @samp{,} operator converts matching uppercase letters
to lowercase. to lowercase.
@ -1941,7 +1951,7 @@ an error message is printed and the command is not executed.
If the shell option @code{nocaseglob} is enabled, the match is performed If the shell option @code{nocaseglob} is enabled, the match is performed
without regard to the case of alphabetic characters. without regard to the case of alphabetic characters.
When a pattern is used for filename generation, the character @samp{.} When a pattern is used for filename expansion, the character @samp{.}
at the start of a filename or immediately following a slash at the start of a filename or immediately following a slash
must be matched explicitly, unless the shell option @code{dotglob} is set. must be matched explicitly, unless the shell option @code{dotglob} is set.
When matching a file name, the slash character must always be When matching a file name, the slash character must always be
@ -2084,6 +2094,14 @@ simple command or may follow a command.
Redirections are processed in the order they appear, from Redirections are processed in the order they appear, from
left to right. left to right.
Each redirection that may be preceded by a file descriptor number
may instead be preceded by a word of the form @{@var{varname}@}.
In this case, for each redirection operator except
>&- and <&-, the shell will allocate a file descriptor greater
than 10 and assign it to @{@var{varname}@}. If >&- or <&- is preceded
by @{@var{varname}@}, the value of @var{varname} defines the file
descriptor to close.
In the following descriptions, if the file descriptor number is In the following descriptions, if the file descriptor number is
omitted, and the first character of the redirection operator is omitted, and the first character of the redirection operator is
@samp{<}, the redirection refers to the standard input (file @samp{<}, the redirection refers to the standard input (file
@ -2765,8 +2783,14 @@ Many of the builtins have been extended by @sc{posix} or Bash.
Unless otherwise noted, each builtin command documented as accepting Unless otherwise noted, each builtin command documented as accepting
options preceded by @samp{-} accepts @samp{--} options preceded by @samp{-} accepts @samp{--}
to signify the end of the options. to signify the end of the options.
For example, the @code{:}, @code{true}, @code{false}, and @code{test} The @code{:}, @code{true}, @code{false}, and @code{test}
builtins do not accept options. builtins do not accept options and do not treat @samp{--} specially.
The @code{exit}, @code{logout}, @code{break}, @code{continue}, @code{let},
and @code{shift} builtins accept and process arguments beginning
with @samp{-} without requiring @samp{--}.
Other builtins that accept arguments but are not specified as accepting
options interpret arguments beginning with @samp{-} as invalid options and
require @samp{--} to prevent this interpretation.
@node Bourne Shell Builtins @node Bourne Shell Builtins
@section Bourne Shell Builtins @section Bourne Shell Builtins
@ -3159,15 +3183,20 @@ The @option{-l} option causes the shell to print a list of signal names
and their corresponding numbers. and their corresponding numbers.
Each @var{sigspec} is either a signal name or a signal number. Each @var{sigspec} is either a signal name or a signal number.
Signal names are case insensitive and the @code{SIG} prefix is optional. Signal names are case insensitive and the @code{SIG} prefix is optional.
If a @var{sigspec} If a @var{sigspec}
is @code{0} or @code{EXIT}, @var{arg} is executed when the shell exits. 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 If a @var{sigspec} is @code{DEBUG}, the command @var{arg} is executed
before every simple command, @code{for} command, @code{case} command, before every simple command, @code{for} command, @code{case} command,
@code{select} command, every arithmetic @code{for} command, and before @code{select} command, every arithmetic @code{for} command, and before
the first command executes in a shell function. the first command executes in a shell function.
Refer to the description of the @code{extglob} option to the Refer to the description of the @code{extdebug} option to the
@code{shopt} builtin (@pxref{The Shopt Builtin}) for details of its @code{shopt} builtin (@pxref{The Shopt Builtin}) for details of its
effect on the @code{DEBUG} trap. effect on the @code{DEBUG} trap.
If a @var{sigspec} is @code{RETURN}, the command @var{arg} is executed
each time a shell function or a script executed with the @code{.} or
@code{source} builtins finishes executing.
If a @var{sigspec} is @code{ERR}, the command @var{arg} 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. subject to the following conditions.
@ -3178,13 +3207,10 @@ part of a command executed in a @code{&&} or @code{||} list,
or if the command's return or if the command's return
status is being inverted using @code{!}. status is being inverted using @code{!}.
These are the same conditions obeyed by the @code{errexit} option. 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.
Signals ignored upon entry to the shell cannot be trapped or reset. Signals ignored upon entry to the shell cannot be trapped or reset.
Trapped signals that are not being ignored are reset to their original Trapped signals that are not being ignored are reset to their original
values in a child process when it is created. values in a subshell or subshell environment when one is created.
The return status is zero unless a @var{sigspec} does not specify a The return status is zero unless a @var{sigspec} does not specify a
valid signal. valid signal.
@ -3625,7 +3651,7 @@ parent.
mapfile [-n @var{count}] [-O @var{origin}] [-s @var{count}] [-t] [-u @var{fd}] [ mapfile [-n @var{count}] [-O @var{origin}] [-s @var{count}] [-t] [-u @var{fd}] [
-C @var{callback}] [-c @var{quantum}] [@var{array}] -C @var{callback}] [-c @var{quantum}] [@var{array}]
@end example @end example
Read lines from the standard input into array variable @var{array}, Read lines from the standard input into the indexed array variable @var{array},
or from file descriptor @var{fd} or from file descriptor @var{fd}
if the @option{-u} option is supplied. if the @option{-u} option is supplied.
The variable @code{MAPFILE} is the default @var{array}. The variable @code{MAPFILE} is the default @var{array}.
@ -3640,7 +3666,7 @@ The default index is 0.
@item -s @item -s
Discard the first @var{count} lines read. Discard the first @var{count} lines read.
@item -t @item -t
Remove a trailing line from each line read. Remove a trailing newline from each line read.
@item -u @item -u
Read lines from file descriptor @var{fd} instead of the standard input. Read lines from file descriptor @var{fd} instead of the standard input.
@item -C @item -C
@ -3661,7 +3687,8 @@ If not supplied with an explicit origin, @code{mapfile} will clear @var{array}
before assigning to it. before assigning to it.
@code{mapfile} returns successfully unless an invalid option or option @code{mapfile} returns successfully unless an invalid option or option
argument is supplied, or @var{array} is invalid or unassignable. argument is supplied, @var{array} is invalid or unassignable, or @var{array}
is not an indexed array.
@item printf @item printf
@btindex printf @btindex printf
@ -3696,7 +3723,7 @@ non-zero on failure.
@item read @item read
@btindex read @btindex read
@example @example
read [-ers] [-a @var{aname}] [-d @var{delim}] [-i @var{text}] [-n @var{nchars}] [-p @var{prompt}] [-t @var{timeout}] [-u @var{fd}] [@var{name} @dots{}] read [-ers] [-a @var{aname}] [-d @var{delim}] [-i @var{text}] [-n @var{nchars}] [-N @var{nchars}] [-p @var{prompt}] [-t @var{timeout}] [-u @var{fd}] [@var{name} @dots{}]
@end example @end example
One line is read from the standard input, or from the file descriptor 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 @var{fd} supplied as an argument to the @option{-u} option, and the first word
@ -3739,7 +3766,16 @@ the editing buffer before editing begins.
@item -n @var{nchars} @item -n @var{nchars}
@code{read} returns after reading @var{nchars} characters rather than @code{read} returns after reading @var{nchars} characters rather than
waiting for a complete line of input. waiting for a complete line of input, but honor a delimiter if fewer
than @var{nchars} characters are read before the delimiter.
@item -N @var{nchars}
@code{read} returns after reading exactly @var{nchars} characters rather
than waiting for a complete line of input, unless EOF is encountered or
@code{read} times out.
Delimiter characters encountered in the input are
not treated specially and do not cause @code{read} to return until
@var{nchars} characters are read.
@item -p @var{prompt} @item -p @var{prompt}
Display @var{prompt}, without a trailing newline, before attempting Display @var{prompt}, without a trailing newline, before attempting
@ -3779,7 +3815,7 @@ Read input from file descriptor @var{fd}.
readarray [-n @var{count}] [-O @var{origin}] [-s @var{count}] [-t] [-u @var{fd}] [ readarray [-n @var{count}] [-O @var{origin}] [-s @var{count}] [-t] [-u @var{fd}] [
-C @var{callback}] [-c @var{quantum}] [@var{array}] -C @var{callback}] [-c @var{quantum}] [@var{array}]
@end example @end example
Read lines from the standard input into array variable @var{array}, Read lines from the standard input into the indexed array variable @var{array},
or from file descriptor @var{fd} or from file descriptor @var{fd}
if the @option{-u} option is supplied. if the @option{-u} option is supplied.
@ -4007,7 +4043,7 @@ separately (@pxref{Command Execution Environment}), and may cause
subshells to exit before executing all the commands in the subshell. subshells to exit before executing all the commands in the subshell.
@item -f @item -f
Disable file name generation (globbing). Disable filename expansion (globbing).
@item -h @item -h
Locate and remember (hash) commands as they are looked up for execution. Locate and remember (hash) commands as they are looked up for execution.
@ -4124,8 +4160,8 @@ Same as @code{-x}.
Turn on privileged mode. Turn on privileged mode.
In this mode, the @env{$BASH_ENV} and @env{$ENV} files are not In this mode, the @env{$BASH_ENV} and @env{$ENV} files are not
processed, shell functions are not inherited from the environment, processed, shell functions are not inherited from the environment,
and the @env{SHELLOPTS}, @env{CDPATH} and @env{GLOBIGNORE} variables, and the @env{SHELLOPTS}, @env{BASHOPTS}, @env{CDPATH} and @env{GLOBIGNORE}
if they appear in the environment, are ignored. variables, if they appear in the environment, are ignored.
If the shell is started with the effective user (group) id not equal to the 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 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. are taken and the effective user id is set to the real user id.
@ -4391,7 +4427,7 @@ performed within @code{$@{@var{parameter}@}} expansions
enclosed in double quotes. This option is enabled by default. enclosed in double quotes. This option is enabled by default.
@item failglob @item failglob
If set, patterns which fail to match filenames during pathname expansion If set, patterns which fail to match filenames during filename expansion
result in an expansion error. result in an expansion error.
@item force_fignore @item force_fignore
@ -4638,6 +4674,16 @@ variables for controlling the job control facilities
@item BASH @item BASH
The full pathname used to execute the current instance of Bash. The full pathname used to execute the current instance of Bash.
@item BASHOPTS
A colon-separated list of enabled shell options. Each word in
the list is a valid argument for the @option{-s} option to the
@code{shopt} builtin command (@pxref{The Shopt Builtin}).
The options appearing in @env{BASHOPTS} are those reported
as @samp{on} by @samp{shopt}.
If this variable is in the environment when Bash
starts up, each shell option in the list will be enabled before
reading any startup files. This variable is readonly.
@item BASHPID @item BASHPID
Expands to the process id of the current Bash process. Expands to the process id of the current Bash process.
This differs from @code{$$} under certain circumstances, such as subshells This differs from @code{$$} under certain circumstances, such as subshells
@ -4750,6 +4796,20 @@ The value of @env{MACHTYPE}.
@item BASH_VERSION @item BASH_VERSION
The version number of the current instance of Bash. The version number of the current instance of Bash.
@item BASH_XTRACEFD
If set to an integer corresponding to a valid file descriptor, Bash
will write the trace output generated when @samp{set -x}
is enabled to that file descriptor.
This allows tracing output to be separated from diagnostic and error
messages.
The file descriptor is closed when @code{BASH_XTRACEFD} is unset or assigned
a new value.
Unsetting @code{BASH_XTRACEFD} or assigning it the empty string causes the
trace output to be sent to the standard error.
Note that setting @code{BASH_XTRACEFD} to 2 (the standard error file
descriptor) and then unsetting it will result in the standard error
being closed.
@item COLUMNS @item COLUMNS
Used by the @code{select} builtin command to determine the terminal width Used by the @code{select} builtin command to determine the terminal width
when printing selection lists. Automatically set upon receipt of a when printing selection lists. Automatically set upon receipt of a
@ -4962,7 +5022,8 @@ is running;
the next time hostname completion is attempted after the the next time hostname completion is attempted after the
value is changed, Bash adds the contents of the new file to the value is changed, Bash adds the contents of the new file to the
existing list. existing list.
If @env{HOSTFILE} is set, but has no value, Bash attempts to read If @env{HOSTFILE} is set, but has no value, or does not name a readable file,
Bash attempts to read
@file{/etc/hosts} to obtain the list of possible hostname completions. @file{/etc/hosts} to obtain the list of possible hostname completions.
When @env{HOSTFILE} is unset, the hostname list is cleared. When @env{HOSTFILE} is unset, the hostname list is cleared.
@ -5482,8 +5543,9 @@ allow them to be specified.
If Bash is started with the effective user (group) id not equal to the 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 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, files are read, shell functions are not inherited from the environment,
the @env{SHELLOPTS} variable, if it appears in the environment, is ignored, the @env{SHELLOPTS}, @env{BASHOPTS}, @env{CDPATH}, and @env{GLOBIGNORE}
and the effective user id is set to the real user id. variables, if they appear in the environment, are ignored, and the effective
user id is set to the real user id.
If the @code{-p} option is supplied at invocation, the startup behavior is If the @code{-p} option is supplied at invocation, the startup behavior is
the same, but the effective user id is not reset. the same, but the effective user id is not reset.
@ -5660,6 +5722,9 @@ If the @var{file} argument to one of the primaries is one of
@file{/dev/stdin}, @file{/dev/stdout}, or @file{/dev/stderr}, file @file{/dev/stdin}, @file{/dev/stdout}, or @file{/dev/stderr}, file
descriptor 0, 1, or 2, respectively, is checked. descriptor 0, 1, or 2, respectively, is checked.
When used with @samp{[[}, The @samp{<} and @samp{>} operators sort
lexicographically using the current locale.
Unless otherwise specified, primaries that operate on files follow symbolic Unless otherwise specified, primaries that operate on files follow symbolic
links and operate on the target of the link, rather than the link itself. links and operate on the target of the link, rather than the link itself.
@ -5752,19 +5817,18 @@ True if the length of @var{string} is zero.
True if the length of @var{string} is non-zero. True if the length of @var{string} is non-zero.
@item @var{string1} == @var{string2} @item @var{string1} == @var{string2}
@itemx @var{string1} = @var{string2}
True if the strings are equal. True if the strings are equal.
@samp{=} may be used in place of @samp{==} for strict @sc{posix} compliance. @samp{=} should be used with the @code{test} command for @sc{posix} conformance.
@item @var{string1} != @var{string2} @item @var{string1} != @var{string2}
True if the strings are not equal. True if the strings are not equal.
@item @var{string1} < @var{string2} @item @var{string1} < @var{string2}
True if @var{string1} sorts before @var{string2} lexicographically True if @var{string1} sorts before @var{string2} lexicographically.
in the current locale.
@item @var{string1} > @var{string2} @item @var{string1} > @var{string2}
True if @var{string1} sorts after @var{string2} lexicographically True if @var{string1} sorts after @var{string2} lexicographically.
in the current locale.
@item @var{arg1} OP @var{arg2} @item @var{arg1} OP @var{arg2}
@code{OP} is one of @code{OP} is one of
@ -6032,11 +6096,14 @@ If @var{subscript} is @samp{@@} or
Referencing an array variable without a subscript is equivalent to Referencing an array variable without a subscript is equivalent to
referencing with a subscript of 0. referencing with a subscript of 0.
An array variable is considered set if a subscript has been assigned a
value. The null string is a valid value.
The @code{unset} builtin is used to destroy arrays. The @code{unset} builtin is used to destroy arrays.
@code{unset} @var{name}[@var{subscript}] @code{unset} @var{name}[@var{subscript}]
destroys the array element at index @var{subscript}. destroys the array element at index @var{subscript}.
Care must be taken to avoid unwanted side effects caused by filename Care must be taken to avoid unwanted side effects caused by filename
generation. expansion.
@code{unset} @var{name}, where @var{name} is an array, removes the @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. A subscript of @samp{*} or @samp{@@} also removes the
entire array. entire array.
@ -6512,6 +6579,11 @@ escape characters are converted.
The @code{ulimit} builtin uses a block size of 512 bytes for the @option{-c} The @code{ulimit} builtin uses a block size of 512 bytes for the @option{-c}
and @option{-f} options. and @option{-f} options.
@item
The arrival of @code{SIGCHLD} when a trap is set on @code{SIGCHLD} does
not interrupt the @code{wait} builtin and cause it to return immediately.
The trap command is run once for each child that exits.
@end enumerate @end enumerate
There is other @sc{posix} behavior that Bash does not implement by There is other @sc{posix} behavior that Bash does not implement by
@ -6561,7 +6633,7 @@ refers to the ability to selectively stop (suspend)
the execution of processes and continue (resume) the execution of processes and continue (resume)
their execution at a later point. A user typically employs their execution at a later point. A user typically employs
this facility via an interactive interface supplied jointly this facility via an interactive interface supplied jointly
by the system's terminal driver and Bash. by the operating system kernel's terminal driver and Bash.
The shell associates a @var{job} with each pipeline. It keeps a The shell associates a @var{job} with each pipeline. It keeps a
table of currently executing jobs, which may be listed with the table of currently executing jobs, which may be listed with the
@ -6586,11 +6658,13 @@ process group @sc{id} is equal to the current terminal process group
These processes are said to be in the foreground. Background These processes are said to be in the foreground. Background
processes are those whose process group @sc{id} differs from the processes are those whose process group @sc{id} differs from the
terminal's; such processes are immune to keyboard-generated terminal's; such processes are immune to keyboard-generated
signals. Only foreground processes are allowed to read from or signals. Only foreground processes are allowed to read from or, if
write to the terminal. Background processes which attempt to the user so specifies with @code{stty tostop}, write to the terminal.
read from (write to) the terminal are sent a @code{SIGTTIN} Background processes which attempt to
(@code{SIGTTOU}) signal by the terminal driver, which, unless read from (write to when @code{stty tostop} is in effect) the
caught, suspends the process. terminal are sent a @code{SIGTTIN} (@code{SIGTTOU})
signal by the kernel's terminal driver,
which, unless caught, suspends the process.
If the operating system on which Bash is running supports If the operating system on which Bash is running supports
job control, Bash contains facilities to use it. Typing the job control, Bash contains facilities to use it. Typing the
@ -7225,6 +7299,10 @@ Include support for the @code{((@dots{}))} command
Include support for the extended pattern matching features described Include support for the extended pattern matching features described
above under @ref{Pattern Matching}. above under @ref{Pattern Matching}.
@item --enable-extended-glob-default
Set the default value of the @var{extglob} shell option described
above under @ref{The Shopt Builtin} to be enabled.
@item --enable-help-builtin @item --enable-help-builtin
Include the @code{help} builtin, which displays help on shell builtins and Include the @code{help} builtin, which displays help on shell builtins and
variables (@pxref{Bash Builtins}). variables (@pxref{Bash Builtins}).
@ -7318,7 +7396,7 @@ But first, you should
make sure that it really is a bug, and that it appears in the latest make sure that it really is a bug, and that it appears in the latest
version of Bash. version of Bash.
The latest version of Bash is always available for FTP from The latest version of Bash is always available for FTP from
@uref{ftp://ftp.gnu.org/pub/bash/}. @uref{ftp://ftp.gnu.org/pub/gnu/bash/}.
Once you have determined that a bug actually exists, use the Once you have determined that a bug actually exists, use the
@code{bashbug} command to submit a bug report. @code{bashbug} command to submit a bug report.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
@c The GNU Free Documentation License. @c The GNU Free Documentation License.
@center Version 1.2, November 2002 @center Version 1.3, 3 November 2008
@c This file is intended to be included within another document, @c This file is intended to be included within another document,
@c hence no sectioning command or @node. @c hence no sectioning command or @node.
@display @display
Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc. Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA @uref{http://fsf.org/}
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
@ -111,6 +111,9 @@ 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, the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text. preceding the beginning of the body of the text.
The ``publisher'' means any person or entity that distributes copies
of the Document to the public.
A section ``Entitled XYZ'' means a named subunit of the Document whose A section ``Entitled XYZ'' means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language. (Here XYZ stands for a text that translates XYZ in another language. (Here XYZ stands for a
@ -379,13 +382,30 @@ title.
@item @item
TERMINATION TERMINATION
You may not copy, modify, sublicense, or distribute the Document except You may not copy, modify, sublicense, or distribute the Document
as expressly provided for under this License. Any other attempt to except as expressly provided under this License. Any attempt
copy, modify, sublicense or distribute the Document is void, and will otherwise to copy, modify, sublicense, or distribute it is void, and
automatically terminate your rights under this License. However, will automatically terminate your rights under this License.
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such However, if you cease all violation of this License, then your license
parties remain in full compliance. from a particular copyright holder is reinstated (a) provisionally,
unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder
fails to notify you of the violation by some reasonable means prior to
60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, receipt of a copy of some or all of the same material does
not give you any rights to use it.
@item @item
FUTURE REVISIONS OF THIS LICENSE FUTURE REVISIONS OF THIS LICENSE
@ -403,7 +423,42 @@ 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 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 Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation. as a draft) by the Free Software Foundation. If the Document
specifies that a proxy can decide which future versions of this
License can be used, that proxy's public statement of acceptance of a
version permanently authorizes you to choose that version for the
Document.
@item
RELICENSING
``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works. A
public wiki that anybody can edit is an example of such a server. A
``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
site means any set of copyrightable works thus published on the MMC
site.
``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
license published by Creative Commons Corporation, a not-for-profit
corporation with a principal place of business in San Francisco,
California, as well as future copyleft versions of that license
published by that same organization.
``Incorporate'' means to publish or republish a Document, in whole or
in part, as part of another Document.
An MMC is ``eligible for relicensing'' if it is licensed under this
License, and if all works that were first published under this License
somewhere other than this MMC, and subsequently incorporated in whole
or in part into the MMC, (1) had no cover texts or invariant sections,
and (2) were thus incorporated prior to November 1, 2008.
The operator of an MMC Site may republish an MMC contained in the site
under CC-BY-SA on the same site at any time before August 1, 2009,
provided the MMC is eligible for relicensing.
@end enumerate @end enumerate
@page @page
@ -417,7 +472,7 @@ license notices just after the title page:
@group @group
Copyright (C) @var{year} @var{your name}. Copyright (C) @var{year} @var{your name}.
Permission is granted to copy, distribute and/or modify this document Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation; or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover 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 Texts. A copy of the license is included in the section entitled ``GNU

View File

@ -1,13 +1,13 @@
GNU Free Documentation License
Version 1.2, November 2002 GNU Free Documentation License
Version 1.3, 3 November 2008
Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
0. PREAMBLE 0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other The purpose of this License is to make a manual, textbook, or other
@ -50,11 +50,11 @@ modifications and/or translated into another language.
A "Secondary Section" is a named appendix or a front-matter section of A "Secondary Section" is a named appendix or a front-matter section of
the Document that deals exclusively with the relationship of the the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall subject publishers or authors of the Document to the Document's overall
(or to related matters) and contains nothing that could fall directly subject (or to related matters) and contains nothing that could fall
within that overall subject. (Thus, if the Document is in part a directly within that overall subject. (Thus, if the Document is in
textbook of mathematics, a Secondary Section may not explain any part a textbook of mathematics, a Secondary Section may not explain
mathematics.) The relationship could be a matter of historical any mathematics.) The relationship could be a matter of historical
connection with the subject or with related matters, or of legal, connection with the subject or with related matters, or of legal,
commercial, philosophical, ethical or political position regarding commercial, philosophical, ethical or political position regarding
them. them.
@ -103,6 +103,9 @@ 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, the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text. preceding the beginning of the body of the text.
The "publisher" means any person or entity that distributes copies of
the Document to the public.
A section "Entitled XYZ" means a named subunit of the Document whose A section "Entitled XYZ" means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language. (Here XYZ stands for a text that translates XYZ in another language. (Here XYZ stands for a
@ -118,14 +121,13 @@ License, but only as regards disclaiming warranties: any other
implication that these Warranty Disclaimers may have is void and has implication that these Warranty Disclaimers may have is void and has
no effect on the meaning of this License. no effect on the meaning of this License.
2. VERBATIM COPYING 2. VERBATIM COPYING
You may copy and distribute the Document in any medium, either You may copy and distribute the Document in any medium, either
commercially or noncommercially, provided that this License, the commercially or noncommercially, provided that this License, the
copyright notices, and the license notice saying this License applies copyright notices, and the license notice saying this License applies
to the Document are reproduced in all copies, and that you add no other to the Document are reproduced in all copies, and that you add no
conditions whatsoever to those of this License. You may not use other conditions whatsoever to those of this License. You may not use
technical measures to obstruct or control the reading or further technical measures to obstruct or control the reading or further
copying of the copies you make or distribute. However, you may accept copying of the copies you make or distribute. However, you may accept
compensation in exchange for copies. If you distribute a large enough compensation in exchange for copies. If you distribute a large enough
@ -169,8 +171,9 @@ Opaque copy (directly or through your agents or retailers) of that
edition to the public. edition to the public.
It is requested, but not required, that you contact the authors of the It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give Document well before redistributing any large number of copies, to
them a chance to provide you with an updated version of the Document. give them a chance to provide you with an updated version of the
Document.
4. MODIFICATIONS 4. MODIFICATIONS
@ -285,16 +288,18 @@ Entitled "Endorsements".
6. COLLECTIONS OF DOCUMENTS 6. COLLECTIONS OF DOCUMENTS
You may make a collection consisting of the Document and other documents You may make a collection consisting of the Document and other
released under this License, and replace the individual copies of this documents released under this License, and replace the individual
License in the various documents with a single copy that is included in copies of this License in the various documents with a single copy
the collection, provided that you follow the rules of this License for that is included in the collection, provided that you follow the rules
verbatim copying of each of the documents in all other respects. 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 You may extract a single document from such a collection, and
it individually under this License, provided you insert a copy of this distribute it individually under this License, provided you insert a
License into the extracted document, and follow this License in all copy of this License into the extracted document, and follow this
other respects regarding verbatim copying of that document. License in all other respects regarding verbatim copying of that
document.
7. AGGREGATION WITH INDEPENDENT WORKS 7. AGGREGATION WITH INDEPENDENT WORKS
@ -304,7 +309,7 @@ and independent documents or works, in or on a volume of a storage or
distribution medium, is called an "aggregate" if the copyright distribution medium, is called an "aggregate" if the copyright
resulting from the compilation is not used to limit the legal rights resulting from the compilation is not used to limit the legal rights
of the compilation's users beyond what the individual works permit. of the compilation's users beyond what the individual works permit.
When the Document is included an aggregate, this License does not When the Document is included in an aggregate, this License does not
apply to the other works in the aggregate which are not themselves apply to the other works in the aggregate which are not themselves
derivative works of the Document. derivative works of the Document.
@ -340,21 +345,38 @@ title.
9. TERMINATION 9. TERMINATION
You may not copy, modify, sublicense, or distribute the Document except You may not copy, modify, sublicense, or distribute the Document
as expressly provided for under this License. Any other attempt to except as expressly provided under this License. Any attempt
copy, modify, sublicense or distribute the Document is void, and will otherwise to copy, modify, sublicense, or distribute it is void, and
automatically terminate your rights under this License. However, will automatically terminate your rights under this License.
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such However, if you cease all violation of this License, then your license
parties remain in full compliance. from a particular copyright holder is reinstated (a) provisionally,
unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder
fails to notify you of the violation by some reasonable means prior to
60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, receipt of a copy of some or all of the same material does
not give you any rights to use it.
10. FUTURE REVISIONS OF THIS LICENSE 10. FUTURE REVISIONS OF THIS LICENSE
The Free Software Foundation may publish new, revised versions The Free Software Foundation may publish new, revised versions of the
of the GNU Free Documentation License from time to time. Such new GNU Free Documentation License from time to time. Such new versions
versions will be similar in spirit to the present version, but may will be similar in spirit to the present version, but may differ in
differ in detail to address new problems or concerns. See detail to address new problems or concerns. See
http://www.gnu.org/copyleft/. http://www.gnu.org/copyleft/.
Each version of the License is given a distinguishing version number. Each version of the License is given a distinguishing version number.
@ -364,7 +386,39 @@ 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 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 Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation. as a draft) by the Free Software Foundation. If the Document
specifies that a proxy can decide which future versions of this
License can be used, that proxy's public statement of acceptance of a
version permanently authorizes you to choose that version for the
Document.
11. RELICENSING
"Massive Multiauthor Collaboration Site" (or "MMC Site") means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works. A
public wiki that anybody can edit is an example of such a server. A
"Massive Multiauthor Collaboration" (or "MMC") contained in the site
means any set of copyrightable works thus published on the MMC site.
"CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
license published by Creative Commons Corporation, a not-for-profit
corporation with a principal place of business in San Francisco,
California, as well as future copyleft versions of that license
published by that same organization.
"Incorporate" means to publish or republish a Document, in whole or in
part, as part of another Document.
An MMC is "eligible for relicensing" if it is licensed under this
License, and if all works that were first published under this License
somewhere other than this MMC, and subsequently incorporated in whole or
in part into the MMC, (1) had no cover texts or invariant sections, and
(2) were thus incorporated prior to November 1, 2008.
The operator of an MMC Site may republish an MMC contained in the site
under CC-BY-SA on the same site at any time before August 1, 2009,
provided the MMC is eligible for relicensing.
ADDENDUM: How to use this License for your documents ADDENDUM: How to use this License for your documents
@ -375,7 +429,7 @@ license notices just after the title page:
Copyright (c) YEAR YOUR NAME. Copyright (c) YEAR YOUR NAME.
Permission is granted to copy, distribute and/or modify this document Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation; or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. 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 A copy of the license is included in the section entitled "GNU

View File

@ -1,6 +1,6 @@
%!PS-Adobe-3.0 %!PS-Adobe-3.0
%%Creator: groff version 1.19.2 %%Creator: groff version 1.19.2
%%CreationDate: Thu Feb 5 08:05:28 2009 %%CreationDate: Wed Dec 30 13:07:37 2009
%%DocumentNeededResources: font Times-Roman %%DocumentNeededResources: font Times-Roman
%%+ font Times-Bold %%+ font Times-Bold
%%DocumentSuppliedResources: procset grops 1.19 2 %%DocumentSuppliedResources: procset grops 1.19 2
@ -240,9 +240,10 @@ E F0(\(1\))A F1(RESTRICTED SHELL)72 112.8 Q F0(If)108 124.8 Q F2(bash)
(bash)2.5 E F0(with the e)2.5 E(xception that the follo)-.15 E (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 (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 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 182.4 S(etting or unsetting the v)-32.5 E(alues of)-.25 E/F3 9
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 /Times-Bold@0 SF(SHELL)2.5 E/F4 9/Times-Roman@0 SF(,)A F3 -.666(PA)2.25
E F2 -.3(BA)2.5 G(SH_ENV).3 E F0 32.5<8373>108 199.2 S G(TH)-.189 E F4(,)A F3(ENV)2.25 E F4(,)A F0(or)2.25 E F3 -.27(BA)2.5 G
(SH_ENV).27 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 (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 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 (as an ar)2.5 E(gument to the)-.18 E F2(.)2.5 E F0 -.2(bu)5 G
@ -252,7 +253,7 @@ E F2 -.3(BA)2.5 G(SH_ENV).3 E F0 32.5<8373>108 199.2 S
(hash)2.851 E F0 -.2(bu)2.851 G .351(iltin com-).2 F(mand)144 244.8 Q (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<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(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 -32.5 E(alue of)-.25 E F3(SHELLOPTS)2.5 E F0(from the shell en)2.25 E
(vironment at startup)-.4 E 32.5<8372>108 295.2 S(edirecting output usi\ (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 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 <8375>108 312 S(sing the)-32.5 E F2(exec)2.5 E F0 -.2(bu)2.5 G

File diff suppressed because it is too large Load Diff

View File

@ -2,9 +2,9 @@
Copyright (C) 1988-2009 Free Software Foundation, Inc. Copyright (C) 1988-2009 Free Software Foundation, Inc.
@end ignore @end ignore
@set LASTCHANGE Fri Feb 13 18:29:03 EST 2009 @set LASTCHANGE Wed Dec 23 16:29:41 EST 2009
@set EDITION 4.0 @set EDITION 4.1
@set VERSION 4.0 @set VERSION 4.1
@set UPDATED 13 February 2009 @set UPDATED 23 December 2009
@set UPDATED-MONTH February 2009 @set UPDATED-MONTH December 2009

View File

@ -53,6 +53,7 @@ extern int errno;
extern int executing_line_number __P((void)); extern int executing_line_number __P((void));
extern int last_command_exit_value;
extern char *shell_name; extern char *shell_name;
#if defined (JOB_CONTROL) #if defined (JOB_CONTROL)
extern pid_t shell_pgrp; extern pid_t shell_pgrp;
@ -331,7 +332,7 @@ parser_error (lineno, format, va_alist)
va_end (args); va_end (args);
if (exit_immediately_on_error) if (exit_immediately_on_error)
exit_shell (2); exit_shell (last_command_exit_value = 2);
} }
#ifdef DEBUG #ifdef DEBUG

View File

@ -1,4 +1,4 @@
#From: Mark Kennedy <mtk@ny.ubs.com> #From: Mark Kennedy <mark.t.kennedy@gmail.com> (<mtk@ny.ubs.com>)
#Message-ID: <35E2B899.63A02DF5@ny.ubs.com> #Message-ID: <35E2B899.63A02DF5@ny.ubs.com>
#Date: Tue, 25 Aug 1998 09:14:01 -0400 #Date: Tue, 25 Aug 1998 09:14:01 -0400
#To: chet@nike.ins.cwru.edu #To: chet@nike.ins.cwru.edu

View File

@ -357,7 +357,7 @@ int flags;
else else
printf("%d\n", st->st_gid); printf("%d\n", st->st_gid);
} else if (flags & OPT_SIZE) } else if (flags & OPT_SIZE)
printf("%ld\n", st->st_size); printf("%ld\n", (long) st->st_size);
return (0); return (0);
} }

View File

@ -72,6 +72,7 @@ printenv_builtin (list)
else else
print_var_value (var, 0); print_var_value (var, 0);
printf("\n");
return (EXECUTION_SUCCESS); return (EXECUTION_SUCCESS);
} }

View File

@ -7,11 +7,13 @@
# Chet Ramey # Chet Ramey
# chet@po.cwru.edu # chet@po.cwru.edu
# #
trap 'rm -f /tmp/cb$$.?' 0 1 2 3 6 15 trap 'rm -f $TMPFILE' 0 1 2 3 6 15
TMPFILE=$(mktemp -t cb.XXXXXX) || exit 1
T=$'\t' T=$'\t'
cat << \EOF >/tmp/cb$$.1 cat << \EOF >$TMPFILE
mkalias () mkalias ()
{ {
case $2 in case $2 in
@ -31,9 +33,9 @@ EOF
# since they whole thing is going to be surrounded by single quotes when # since they whole thing is going to be surrounded by single quotes when
# passed to mkalias # passed to mkalias
sed -e "s:':\\'\\\'\\':" -e "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>/tmp/cb$$.1 sed -e "s:':\\'\\\'\\':" -e "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>$TMPFILE
$BASH /tmp/cb$$.1 | sed -e 's/\$cwd/\$PWD/g' \ $BASH $TMPFILE | sed -e 's/\$cwd/\$PWD/g' \
-e 's/\$term/\$TERM/g' \ -e 's/\$term/\$TERM/g' \
-e 's/\$home/\$HOME/g' \ -e 's/\$home/\$HOME/g' \
-e 's/\$user/\$USER/g' \ -e 's/\$user/\$USER/g' \

View File

@ -7,11 +7,11 @@
# Chet Ramey # Chet Ramey
# chet@po.cwru.edu # chet@po.cwru.edu
# #
trap 'rm -f /tmp/cb$$.?' 0 1 2 3 6 15 trap 'rm -f $TMPFILE' 0 1 2 3 6 15
TMPFILE=$(mktemp -t cb.XXXXXX) || exit 1
T=' ' T=' '
cat << \EOF >/tmp/cb$$.1 cat << \EOF >$TMPFILE
mkalias () mkalias ()
{ {
case $2 in case $2 in
@ -31,9 +31,9 @@ EOF
# since they whole thing is going to be surrounded by single quotes when # since they whole thing is going to be surrounded by single quotes when
# passed to mkalias # passed to mkalias
sed -e "s:':\\'\\\'\\':" -e "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>/tmp/cb$$.1 sed -e "s:':\\'\\\'\\':" -e "s/^\([a-zA-Z0-9_-]*\)$T\(.*\)$/mkalias \1 '\2'/" >>$TMPFILE
sh /tmp/cb$$.1 | sed -e 's/\$cwd/\$PWD/g' \ sh $TMPFILE | sed -e 's/\$cwd/\$PWD/g' \
-e 's/\$term/\$TERM/g' \ -e 's/\$term/\$TERM/g' \
-e 's/\$home/\$HOME/g' \ -e 's/\$home/\$HOME/g' \
-e 's/\$user/\$USER/g' \ -e 's/\$user/\$USER/g' \

View File

@ -15,25 +15,34 @@
# Chet Ramey # Chet Ramey
# chet@po.cwru.edu # chet@po.cwru.edu
# #
trap 'rm -f /tmp/cb$$.? cshout cshin' 0 1 2 3 6 15 trap 'rm -f $TMPFILE1 $TMPFILEa $TMPFILEe $TMPFILEv $TMPFILEco $TMPFILEci' 0 1 2 3 6 15
{ TMPFILE1=$(mktemp -t cb.1.XXXXXX) &&
TMPFILEa=$(mktemp -t cb.a.XXXXXX) &&
TMPFILEe=$(mktemp -t cb.e.XXXXXX) &&
TMPFILEv=$(mktemp -t cb.v.XXXXXX) &&
TMPFILEco=$(mktemp -t cshout.XXXXXX) &&
TMPFILEci=$(mktemp -t cshin.XXXXXX)
} || exit 1
T=$'\t' T=$'\t'
SOURCE="${1:+source $1}" SOURCE="${1:+source $1}"
cat << EOF >cshin cat << EOF >$TMPFILEci
$SOURCE $SOURCE
alias >! /tmp/cb$$.a alias >! $TMPFILEa
setenv >! /tmp/cb$$.e setenv >! $TMPFILEe
set >! /tmp/cb$$.v set >! $TMPFILEv
EOF EOF
# give csh a minimal environment, similar to what login would provide # give csh a minimal environment, similar to what login would provide
/usr/bin/env - USER=$USER HOME=$HOME PATH=/usr/bin:/bin:/usr/ucb:. TERM=$TERM SHELL=$SHELL /bin/csh -i < ./cshin > cshout 2>&1 /usr/bin/env - USER=$USER HOME=$HOME PATH=/usr/bin:/bin:/usr/ucb:. TERM=$TERM SHELL=$SHELL /bin/csh -i < $TMPFILEci > $TMPFILEco 2>&1
# First convert aliases # First convert aliases
cat << \EOF >/tmp/cb$$.1 cat << \EOF >$TMPFILE1
mkalias () mkalias ()
{ {
case $2 in case $2 in
@ -49,12 +58,12 @@ mkalias ()
} }
EOF EOF
sed "s/^\([a-zA-Z0-9_]*\)$T\(.*\)$/mkalias \1 '\2'/" < /tmp/cb$$.a >>/tmp/cb$$.1 sed "s/^\([a-zA-Z0-9_]*\)$T\(.*\)$/mkalias \1 '\2'/" < $TMPFILEa >>$TMPFILE1
echo '# csh aliases' echo '# csh aliases'
echo echo
$BASH /tmp/cb$$.1 | sed -e 's/\$cwd/\$PWD/g' \ $BASH $TMPFILE1 | sed -e 's/\$cwd/\$PWD/g' \
-e 's/\$term/\$TERM/g' \ -e 's/\$term/\$TERM/g' \
-e 's/\$home/\$HOME/g' \ -e 's/\$home/\$HOME/g' \
-e 's/\$user/\$USER/g' \ -e 's/\$user/\$USER/g' \
@ -70,7 +79,7 @@ sed -e '/^SHLVL/d' \
-e '/^PWD/d' \ -e '/^PWD/d' \
-e "s/'/'"\\\\"''"/g \ -e "s/'/'"\\\\"''"/g \
-e "s/^\([A-Za-z0-9_]*=\)/export \1'/" \ -e "s/^\([A-Za-z0-9_]*=\)/export \1'/" \
-e "s/$/'/" < /tmp/cb$$.e -e "s/$/'/" < $TMPFILEe
# Finally, convert local variables # Finally, convert local variables
echo echo
@ -82,7 +91,7 @@ sed -e 's/'"$T"'/=/' \
-e '/^[A-Za-z0-9_]*=[^(]/{ -e '/^[A-Za-z0-9_]*=[^(]/{
s/=/='"'/"' s/=/='"'/"'
s/$/'"'/"' s/$/'"'/"'
}' < /tmp/cb$$.v | }' < $TMPFILEv |
sed -e '/^argv=/d' -e '/^cwd=/d' -e '/^filec=/d' -e '/^status=/d' \ sed -e '/^argv=/d' -e '/^cwd=/d' -e '/^filec=/d' -e '/^status=/d' \
-e '/^verbose=/d' \ -e '/^verbose=/d' \
-e '/^term=/d' \ -e '/^term=/d' \
@ -110,7 +119,7 @@ echo
echo '# special csh variables converted to bash equivalents' echo '# special csh variables converted to bash equivalents'
echo echo
sed -e 's/'"$T"'/=/' < /tmp/cb$$.v | sed -e 's/'"$T"'/=/' < $TMPFILEv |
grep "^cdpath=" | grep "^cdpath=" |
sed 's/(// sed 's/(//
s/ /:/g s/ /:/g
@ -118,7 +127,7 @@ sed 's/(//
s/cdpath=/CDPATH=/' s/cdpath=/CDPATH=/'
sed -e 's/'"$T"'/=/' < /tmp/cb$$.v | sed -e 's/'"$T"'/=/' < $TMPFILEv |
grep "^mail=" | grep "^mail=" |
sed 's/(// sed 's/(//
s/ /:/g s/ /:/g

View File

@ -1,7 +1,7 @@
shcat() shcat()
{ {
while read -r ; do while read -r ; do
echo "$REPLY" printf "%s\n" "$REPLY"
done done
} }

View File

@ -57,6 +57,8 @@
extern int errno; extern int errno;
#endif #endif
#define NEED_FPURGE_DECL
#include "bashansi.h" #include "bashansi.h"
#include "bashintl.h" #include "bashintl.h"
@ -100,7 +102,7 @@ extern int posixly_correct;
extern int expand_aliases; extern int expand_aliases;
extern int autocd; extern int autocd;
extern int breaking, continuing, loop_level; extern int breaking, continuing, loop_level;
extern int parse_and_execute_level, running_trap; extern int parse_and_execute_level, running_trap, sourcelevel;
extern int command_string_index, line_number; extern int command_string_index, line_number;
extern int dot_found_in_search; extern int dot_found_in_search;
extern int already_making_children; extern int already_making_children;
@ -267,6 +269,10 @@ static int showing_function_line;
static int line_number_for_err_trap; static int line_number_for_err_trap;
/* A sort of function nesting level counter */
static int funcnest = 0;
int funcnest_max = 0; /* XXX - for bash-4.2 */
struct fd_bitmap *current_fds_to_close = (struct fd_bitmap *)NULL; struct fd_bitmap *current_fds_to_close = (struct fd_bitmap *)NULL;
#define FD_BITMAP_DEFAULT_SIZE 32 #define FD_BITMAP_DEFAULT_SIZE 32
@ -607,7 +613,6 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
else else
exec_result = last_command_exit_value; exec_result = last_command_exit_value;
if (user_subshell && was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS) if (user_subshell && was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
{ {
last_command_exit_value = exec_result; last_command_exit_value = exec_result;
@ -883,19 +888,58 @@ execute_command_internal (command, asynchronous, pipe_in, pipe_out,
#if defined (DPAREN_ARITHMETIC) #if defined (DPAREN_ARITHMETIC)
case cm_arith: case cm_arith:
was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
if (ignore_return) if (ignore_return)
command->value.Arith->flags |= CMD_IGNORE_RETURN; command->value.Arith->flags |= CMD_IGNORE_RETURN;
line_number_for_err_trap = save_line_number = line_number;
exec_result = execute_arith_command (command->value.Arith); exec_result = execute_arith_command (command->value.Arith);
line_number = save_line_number;
if (was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
{
last_command_exit_value = exec_result;
save_line_number = line_number;
line_number = line_number_for_err_trap;
run_error_trap ();
line_number = save_line_number;
}
if (ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
{
last_command_exit_value = exec_result;
run_pending_traps ();
jump_to_top_level (ERREXIT);
}
break; break;
#endif #endif
#if defined (COND_COMMAND) #if defined (COND_COMMAND)
case cm_cond: case cm_cond:
was_error_trap = signal_is_trapped (ERROR_TRAP) && signal_is_ignored (ERROR_TRAP) == 0;
if (ignore_return) if (ignore_return)
command->value.Cond->flags |= CMD_IGNORE_RETURN; command->value.Cond->flags |= CMD_IGNORE_RETURN;
save_line_number = line_number;
line_number_for_err_trap = save_line_number = line_number;
exec_result = execute_cond_command (command->value.Cond); exec_result = execute_cond_command (command->value.Cond);
line_number = save_line_number; line_number = save_line_number;
if (was_error_trap && ignore_return == 0 && invert == 0 && exec_result != EXECUTION_SUCCESS)
{
last_command_exit_value = exec_result;
save_line_number = line_number;
line_number = line_number_for_err_trap;
run_error_trap ();
line_number = save_line_number;
}
if (ignore_return == 0 && invert == 0 && exit_immediately_on_error && exec_result != EXECUTION_SUCCESS)
{
last_command_exit_value = exec_result;
run_pending_traps ();
jump_to_top_level (ERREXIT);
}
break; break;
#endif #endif
@ -1248,6 +1292,7 @@ execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close)
{ {
int user_subshell, return_code, function_value, should_redir_stdin, invert; int user_subshell, return_code, function_value, should_redir_stdin, invert;
int ois, user_coproc; int ois, user_coproc;
int result;
COMMAND *tcom; COMMAND *tcom;
USE_VAR(user_subshell); USE_VAR(user_subshell);
@ -1414,13 +1459,21 @@ execute_in_subshell (command, asynchronous, pipe_in, pipe_out, fds_to_close)
invert = (tcom->flags & CMD_INVERT_RETURN) != 0; invert = (tcom->flags & CMD_INVERT_RETURN) != 0;
tcom->flags &= ~CMD_INVERT_RETURN; tcom->flags &= ~CMD_INVERT_RETURN;
result = setjmp (top_level);
/* If we're inside a function while executing this subshell, we /* If we're inside a function while executing this subshell, we
need to handle a possible `return'. */ need to handle a possible `return'. */
function_value = 0; function_value = 0;
if (return_catch_flag) if (return_catch_flag)
function_value = setjmp (return_catch); function_value = setjmp (return_catch);
if (function_value) /* If we're going to exit the shell, we don't want to invert the return
status. */
if (result == EXITPROG)
invert = 0, return_code = last_command_exit_value;
else if (result)
return_code = EXECUTION_FAILURE;
else if (function_value)
return_code = return_catch_value; return_code = return_catch_value;
else else
return_code = execute_command_internal (tcom, asynchronous, NO_PIPE, NO_PIPE, fds_to_close); return_code = execute_command_internal (tcom, asynchronous, NO_PIPE, NO_PIPE, fds_to_close);
@ -1928,7 +1981,7 @@ execute_coproc (command, pipe_in, pipe_out, fds_to_close)
int pipe_in, pipe_out; int pipe_in, pipe_out;
struct fd_bitmap *fds_to_close; struct fd_bitmap *fds_to_close;
{ {
int rpipe[2], wpipe[2]; int rpipe[2], wpipe[2], estat;
pid_t coproc_pid; pid_t coproc_pid;
Coproc *cp; Coproc *cp;
char *tcmd; char *tcmd;
@ -1957,7 +2010,12 @@ execute_coproc (command, pipe_in, pipe_out, fds_to_close)
close (rpipe[0]); close (rpipe[0]);
close (wpipe[1]); close (wpipe[1]);
exit (execute_in_subshell (command, 1, wpipe[0], rpipe[1], fds_to_close)); estat = execute_in_subshell (command, 1, wpipe[0], rpipe[1], fds_to_close);
fflush (stdout);
fflush (stderr);
exit (estat);
} }
close (rpipe[1]); close (rpipe[1]);
@ -3156,11 +3214,19 @@ static int
execute_cond_node (cond) execute_cond_node (cond)
COND_COM *cond; COND_COM *cond;
{ {
int result, invert, patmatch, rmatch, mflags; int result, invert, patmatch, rmatch, mflags, ignore;
char *arg1, *arg2; char *arg1, *arg2;
invert = (cond->flags & CMD_INVERT_RETURN); invert = (cond->flags & CMD_INVERT_RETURN);
ignore = (cond->flags & CMD_IGNORE_RETURN);
if (ignore)
{
if (cond->left)
cond->left->flags |= CMD_IGNORE_RETURN;
if (cond->right)
cond->right->flags |= CMD_IGNORE_RETURN;
}
if (cond->type == COND_EXPR) if (cond->type == COND_EXPR)
result = execute_cond_node (cond->left); result = execute_cond_node (cond->left);
else if (cond->type == COND_OR) else if (cond->type == COND_OR)
@ -3177,7 +3243,11 @@ execute_cond_node (cond)
} }
else if (cond->type == COND_UNARY) else if (cond->type == COND_UNARY)
{ {
if (ignore)
comsub_ignore_return++;
arg1 = cond_expand_word (cond->left->op, 0); arg1 = cond_expand_word (cond->left->op, 0);
if (ignore)
comsub_ignore_return--;
if (arg1 == 0) if (arg1 == 0)
arg1 = nullstr; arg1 = nullstr;
if (echo_command_at_execute) if (echo_command_at_execute)
@ -3197,11 +3267,19 @@ execute_cond_node (cond)
cond->op->word[2] == '\0'); cond->op->word[2] == '\0');
#endif #endif
if (ignore)
comsub_ignore_return++;
arg1 = cond_expand_word (cond->left->op, 0); arg1 = cond_expand_word (cond->left->op, 0);
if (ignore)
comsub_ignore_return--;
if (arg1 == 0) if (arg1 == 0)
arg1 = nullstr; arg1 = nullstr;
if (ignore)
comsub_ignore_return++;
arg2 = cond_expand_word (cond->right->op, arg2 = cond_expand_word (cond->right->op,
(rmatch && shell_compatibility_level > 31) ? 2 : (patmatch ? 1 : 0)); (rmatch && shell_compatibility_level > 31) ? 2 : (patmatch ? 1 : 0));
if (ignore)
comsub_ignore_return--;
if (arg2 == 0) if (arg2 == 0)
arg2 = nullstr; arg2 = nullstr;
@ -3224,7 +3302,7 @@ execute_cond_node (cond)
int oe; int oe;
oe = extended_glob; oe = extended_glob;
extended_glob = 1; extended_glob = 1;
result = binary_test (cond->op->word, arg1, arg2, TEST_PATMATCH|TEST_ARITHEXP) result = binary_test (cond->op->word, arg1, arg2, TEST_PATMATCH|TEST_ARITHEXP|TEST_LOCALE)
? EXECUTION_SUCCESS ? EXECUTION_SUCCESS
: EXECUTION_FAILURE; : EXECUTION_FAILURE;
extended_glob = oe; extended_glob = oe;
@ -3261,7 +3339,6 @@ execute_cond_command (cond_command)
/* If we're in a function, update the line number information. */ /* If we're in a function, update the line number information. */
if (variable_context && interactive_shell) if (variable_context && interactive_shell)
line_number -= function_line_number; line_number -= function_line_number;
command_string_index = 0; command_string_index = 0;
print_cond_command (cond_command); print_cond_command (cond_command);
@ -3315,8 +3392,13 @@ execute_null_command (redirects, pipe_in, pipe_out, async)
int pipe_in, pipe_out, async; int pipe_in, pipe_out, async;
{ {
int r; int r;
int forcefork;
REDIRECT *rd;
if (pipe_in != NO_PIPE || pipe_out != NO_PIPE || async) for (forcefork = 0, rd = redirects; rd; rd = rd->next)
forcefork += rd->rflags & REDIR_VARASSIGN;
if (forcefork || pipe_in != NO_PIPE || pipe_out != NO_PIPE || async)
{ {
/* We have a null command, but we really want a subshell to take /* We have a null command, but we really want a subshell to take
care of it. Just fork, do piping and redirections, and exit. */ care of it. Just fork, do piping and redirections, and exit. */
@ -3457,7 +3539,7 @@ execute_simple_command (simple_command, pipe_in, pipe_out, async, fds_to_close)
command_line = (char *)0; command_line = (char *)0;
/* If we're in a function, update the line number information. */ /* If we're in a function, update the line number information. */
if (variable_context && interactive_shell) if (variable_context && interactive_shell && sourcelevel == 0)
line_number -= function_line_number; line_number -= function_line_number;
/* Remember what this command line looks like at invocation. */ /* Remember what this command line looks like at invocation. */
@ -3814,25 +3896,35 @@ execute_builtin (builtin, words, flags, subshell)
{ {
int old_e_flag, result, eval_unwind; int old_e_flag, result, eval_unwind;
int isbltinenv; int isbltinenv;
char *error_trap;
#if 0 #if 0
/* XXX -- added 12/11 */ /* XXX -- added 12/11 */
terminate_immediately++; terminate_immediately++;
#endif #endif
error_trap = 0;
old_e_flag = exit_immediately_on_error; old_e_flag = exit_immediately_on_error;
/* The eval builtin calls parse_and_execute, which does not know about /* The eval builtin calls parse_and_execute, which does not know about
the setting of flags, and always calls the execution functions with 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 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 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 value of the command, we turn the -e flag off ourselves and disable
restore it when the command completes. This is also a problem (as the ERR trap, then restore them when the command completes. This is
below) for the command and source/. builtins. */ also a problem (as below) for the command and source/. builtins. */
if (subshell == 0 && (flags & CMD_IGNORE_RETURN) && if (subshell == 0 && (flags & CMD_IGNORE_RETURN) &&
(builtin == eval_builtin || builtin == command_builtin || builtin == source_builtin)) (builtin == eval_builtin || builtin == command_builtin || builtin == source_builtin))
{ {
begin_unwind_frame ("eval_builtin"); begin_unwind_frame ("eval_builtin");
unwind_protect_int (exit_immediately_on_error); unwind_protect_int (exit_immediately_on_error);
error_trap = TRAP_STRING (ERROR_TRAP);
if (error_trap)
{
error_trap = savestring (error_trap);
add_unwind_protect (xfree, error_trap);
add_unwind_protect (set_error_trap, error_trap);
restore_default_signal (ERROR_TRAP);
}
exit_immediately_on_error = 0; exit_immediately_on_error = 0;
eval_unwind = 1; eval_unwind = 1;
} }
@ -3883,6 +3975,11 @@ execute_builtin (builtin, words, flags, subshell)
if (eval_unwind) if (eval_unwind)
{ {
exit_immediately_on_error += old_e_flag; exit_immediately_on_error += old_e_flag;
if (error_trap)
{
set_error_trap (error_trap);
xfree (error_trap);
}
discard_unwind_frame ("eval_builtin"); discard_unwind_frame ("eval_builtin");
} }
@ -3911,10 +4008,17 @@ execute_function (var, words, flags, fds_to_close, async, subshell)
#endif #endif
FUNCTION_DEF *shell_fn; FUNCTION_DEF *shell_fn;
char *sfile, *t; char *sfile, *t;
static int funcnest = 0;
USE_VAR(fc); USE_VAR(fc);
#if 0 /* for bash-4.2 */
if (funcnest_max > 0 && funcnest >= funcnest_max)
{
internal_error ("%s: maximum function nesting level exceeded (%d)", var->name, funcnest);
jump_to_top_level (DISCARD);
}
#endif
#if defined (ARRAY_VARS) #if defined (ARRAY_VARS)
GET_ARRAY_FROM_VAR ("FUNCNAME", funcname_v, funcname_a); GET_ARRAY_FROM_VAR ("FUNCNAME", funcname_v, funcname_a);
GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v, bash_source_a); GET_ARRAY_FROM_VAR ("BASH_SOURCE", bash_source_v, bash_source_a);
@ -3936,6 +4040,7 @@ execute_function (var, words, flags, fds_to_close, async, subshell)
add_unwind_protect (dispose_command, (char *)tc); add_unwind_protect (dispose_command, (char *)tc);
unwind_protect_pointer (this_shell_function); unwind_protect_pointer (this_shell_function);
unwind_protect_int (loop_level); unwind_protect_int (loop_level);
unwind_protect_int (funcnest);
} }
else else
push_context (var->name, subshell, temporary_env); /* don't unwind-protect for subshells */ push_context (var->name, subshell, temporary_env); /* don't unwind-protect for subshells */
@ -4077,7 +4182,6 @@ execute_function (var, words, flags, fds_to_close, async, subshell)
if (subshell == 0) if (subshell == 0)
run_unwind_frame ("function_calling"); run_unwind_frame ("function_calling");
funcnest--;
#if defined (ARRAY_VARS) #if defined (ARRAY_VARS)
/* These two variables cannot be unset, and cannot be affected by the /* These two variables cannot be unset, and cannot be affected by the
function. */ function. */
@ -4092,8 +4196,13 @@ execute_function (var, words, flags, fds_to_close, async, subshell)
#endif #endif
if (variable_context == 0 || this_shell_function == 0) if (variable_context == 0 || this_shell_function == 0)
make_funcname_visible (0); {
make_funcname_visible (0);
#if defined (PROCESS_SUBSTITUTION)
unlink_fifo_list ();
#endif
}
return (result); return (result);
} }
@ -4369,7 +4478,7 @@ execute_disk_command (words, redirects, command_line, pipe_in, pipe_out,
#if defined (RESTRICTED_SHELL) #if defined (RESTRICTED_SHELL)
command = (char *)NULL; command = (char *)NULL;
if (restricted && xstrchr (pathname, '/')) if (restricted && mbschr (pathname, '/'))
{ {
internal_error (_("%s: restricted: cannot specify `/' in command names"), internal_error (_("%s: restricted: cannot specify `/' in command names"),
pathname); pathname);
@ -4482,7 +4591,8 @@ parent_return:
/* Make sure that the pipes are closed in the parent. */ /* Make sure that the pipes are closed in the parent. */
close_pipes (pipe_in, pipe_out); close_pipes (pipe_in, pipe_out);
#if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD) #if defined (PROCESS_SUBSTITUTION) && defined (HAVE_DEV_FD)
unlink_fifo_list (); if (variable_context == 0)
unlink_fifo_list ();
#endif #endif
FREE (command); FREE (command);
} }
@ -4631,7 +4741,7 @@ initialize_subshell ()
parse_and_execute_level = 0; /* nothing left to restore it */ parse_and_execute_level = 0; /* nothing left to restore it */
/* We're no longer inside a shell function. */ /* We're no longer inside a shell function. */
variable_context = return_catch_flag = 0; variable_context = return_catch_flag = funcnest = 0;
executing_list = 0; /* XXX */ executing_list = 0; /* XXX */

5
expr.c
View File

@ -202,7 +202,7 @@ static int expr_depth; /* Location in the stack. */
static int expr_stack_size; /* Number of slots already allocated. */ static int expr_stack_size; /* Number of slots already allocated. */
extern char *this_command_name; extern char *this_command_name;
extern int unbound_vars_is_error; extern int unbound_vars_is_error, last_command_exit_value;
#if defined (ARRAY_VARS) #if defined (ARRAY_VARS)
extern const char * const bash_badsub_errmsg; extern const char * const bash_badsub_errmsg;
@ -923,6 +923,7 @@ expr_streval (tok, e)
value = tok; value = tok;
#endif #endif
last_command_exit_value = EXECUTION_FAILURE;
err_unboundvar (value); err_unboundvar (value);
#if defined (ARRAY_VARS) #if defined (ARRAY_VARS)
@ -1057,7 +1058,7 @@ readtok ()
#if defined (ARRAY_VARS) #if defined (ARRAY_VARS)
if (c == '[') if (c == '[')
{ {
e = skipsubscript (cp, 0); e = skipsubscript (cp, 0, 0);
if (cp[e] == ']') if (cp[e] == ']')
{ {
cp += e + 1; cp += e + 1;

View File

@ -54,6 +54,12 @@ extern void print_cond_command __P((COND_COM *));
#endif #endif
/* set -x support */ /* set -x support */
extern void xtrace_init __P((void));
#ifdef NEED_XTRACE_SET_DECL
extern void xtrace_set __P((int, FILE *));
#endif
extern void xtrace_fdchk __P((int));
extern void xtrace_reset __P((void));
extern char *indirection_level_string __P((void)); extern char *indirection_level_string __P((void));
extern void xtrace_print_assignment __P((char *, char *, int, int)); extern void xtrace_print_assignment __P((char *, char *, int, int));
extern void xtrace_print_word_list __P((WORD_LIST *, int)); extern void xtrace_print_word_list __P((WORD_LIST *, int));
@ -135,7 +141,7 @@ extern int find_string_in_alist __P((char *, STRING_INT_ALIST *, int));
extern char *find_token_in_alist __P((int, STRING_INT_ALIST *, int)); extern char *find_token_in_alist __P((int, STRING_INT_ALIST *, int));
extern int find_index_in_alist __P((char *, STRING_INT_ALIST *, int)); extern int find_index_in_alist __P((char *, STRING_INT_ALIST *, int));
extern char *substring __P((char *, int, int)); extern char *substring __P((const char *, int, int));
extern char *strsub __P((char *, char *, char *, int)); extern char *strsub __P((char *, char *, char *, int));
extern char *strcreplace __P((char *, int, char *, int)); extern char *strcreplace __P((char *, int, char *, int));
extern void strip_leading __P((char *)); extern void strip_leading __P((char *));
@ -191,6 +197,10 @@ extern char *fmtullong __P((unsigned long long int, int, char *, size_t, int));
/* Declarations for functions defined in lib/sh/fmtumax.c */ /* Declarations for functions defined in lib/sh/fmtumax.c */
extern char *fmtumax __P((uintmax_t, int, char *, size_t, int)); extern char *fmtumax __P((uintmax_t, int, char *, size_t, int));
/* Declarations for functions defined in lib/sh/fnxform.c */
extern char *fnx_fromfs __P((char *, size_t));
extern char *fnx_tofs __P((char *, size_t));
/* Declarations for functions defined in lib/sh/fpurge.c */ /* Declarations for functions defined in lib/sh/fpurge.c */
#if defined NEED_FPURGE_DECL #if defined NEED_FPURGE_DECL
@ -226,6 +236,21 @@ extern char *uitos __P((uintmax_t));
extern char *sh_makepath __P((const char *, const char *, int)); extern char *sh_makepath __P((const char *, const char *, int));
/* declarations for functions defined in lib/sh/mbscasecmp.c */
#if !defined (HAVE_MBSCASECMP)
extern char *mbscasecmp __P((const char *, const char *));
#endif
/* declarations for functions defined in lib/sh/mbschr.c */
#if !defined (HAVE_MBSCHR)
extern char *mbschr __P((const char *, int));
#endif
/* declarations for functions defined in lib/sh/mbscmp.c */
#if !defined (HAVE_MBSCMP)
extern char *mbscmp __P((const char *, const char *));
#endif
/* declarations for functions defined in lib/sh/netconn.c */ /* declarations for functions defined in lib/sh/netconn.c */
extern int isnetconn __P((int)); extern int isnetconn __P((int));
@ -295,6 +320,11 @@ extern int strncasecmp __P((const char *, const char *, int));
extern int strcasecmp __P((const char *, const char *)); extern int strcasecmp __P((const char *, const char *));
#endif /* HAVE_STRCASECMP */ #endif /* HAVE_STRCASECMP */
/* declarations for functions defined in lib/sh/strcasestr.c */
#if ! HAVE_STRCASESTR
extern char *strcasestr __P((const char *, const char *));
#endif
/* declarations for functions defined in lib/sh/strerror.c */ /* declarations for functions defined in lib/sh/strerror.c */
#if !defined (HAVE_STRERROR) && !defined (strerror) #if !defined (HAVE_STRERROR) && !defined (strerror)
extern char *strerror __P((int)); extern char *strerror __P((int));
@ -305,9 +335,6 @@ extern char *strerror __P((int));
extern size_t strftime __P((char *, size_t, const char *, const struct tm *)); extern size_t strftime __P((char *, size_t, const char *, const struct tm *));
#endif #endif
/* declarations for functions defined in lib/sh/strindex.c */
extern char *strindex __P((const char *, const char *));
/* declarations for functions and structures defined in lib/sh/stringlist.c */ /* declarations for functions and structures defined in lib/sh/stringlist.c */
/* This is a general-purpose argv-style array struct. */ /* This is a general-purpose argv-style array struct. */
@ -424,10 +451,6 @@ extern unsigned int fsleep __P((unsigned int, unsigned int));
/* declarations for functions defined in lib/sh/winsize.c */ /* declarations for functions defined in lib/sh/winsize.c */
extern void get_new_window_size __P((int, int *, int *)); extern void get_new_window_size __P((int, int *, int *));
/* declarations for functions defined in lib/sh/xstrchr.c */
#undef xstrchr
extern char *xstrchr __P((const char *, int));
/* declarations for functions defined in lib/sh/zcatfd.c */ /* declarations for functions defined in lib/sh/zcatfd.c */
extern int zcatfd __P((int, int, char *)); extern int zcatfd __P((int, int, char *));

View File

@ -93,7 +93,18 @@ file_status (name)
r = FS_EXISTS; r = FS_EXISTS;
#if defined (AFS) #if defined (HAVE_EACCESS)
/* Use eaccess(2) if we have it to take things like ACLs and other
file access mechanisms into account. eaccess uses the effective
user and group IDs, not the real ones. We could use sh_eaccess,
but we don't want any special treatment for /dev/fd. */
if (eaccess (name, X_OK) == 0)
r |= FS_EXECABLE;
if (eaccess (name, R_OK) == 0)
r |= FS_READABLE;
return r;
#elif defined (AFS)
/* We have to use access(2) to determine access because AFS does not /* We have to use access(2) to determine access because AFS does not
support Unix file system semantics. This may produce wrong support Unix file system semantics. This may produce wrong
answers for non-AFS files when ruid != euid. I hate AFS. */ answers for non-AFS files when ruid != euid. I hate AFS. */
@ -103,7 +114,7 @@ file_status (name)
r |= FS_READABLE; r |= FS_READABLE;
return r; return r;
#else /* !AFS */ #else /* !HAVE_EACCESS && !AFS */
/* Find out if the file is actually executable. By definition, the /* Find out if the file is actually executable. By definition, the
only other criteria is that the file has an execute bit set that only other criteria is that the file has an execute bit set that

View File

@ -98,7 +98,7 @@ string_to_rlimtype (s)
neg = 0; neg = 0;
while (s && *s && whitespace (*s)) while (s && *s && whitespace (*s))
s++; s++;
if (*s == '-' || *s == '+') if (s && (*s == '-' || *s == '+'))
{ {
neg = *s == '-'; neg = *s == '-';
s++; s++;
@ -285,7 +285,7 @@ assignment (string, flags)
#if defined (ARRAY_VARS) #if defined (ARRAY_VARS)
if (c == '[') if (c == '[')
{ {
newi = skipsubscript (string, indx); newi = skipsubscript (string, indx, 0);
if (string[newi++] != ']') if (string[newi++] != ']')
return (0); return (0);
if (string[newi] == '+' && string[newi+1] == '=') if (string[newi] == '+' && string[newi+1] == '=')
@ -577,7 +577,7 @@ int
absolute_program (string) absolute_program (string)
const char *string; const char *string;
{ {
return ((char *)xstrchr (string, '/') != (char *)NULL); return ((char *)mbschr (string, '/') != (char *)NULL);
} }
/* **************************************************************** */ /* **************************************************************** */
@ -717,7 +717,7 @@ trim_pathname (name, maxlen)
for (ndirs = 0, ntail = nbeg; *ntail; ntail++) for (ndirs = 0, ntail = nbeg; *ntail; ntail++)
if (*ntail == '/') if (*ntail == '/')
ndirs++; ndirs++;
if (ndirs <= nskip) if (ndirs < nskip)
return name; return name;
for (ntail = (*nend == '/') ? nend : nend - 1; ntail > nbeg; ntail--) for (ntail = (*nend == '/') ? nend : nend - 1; ntail > nbeg; ntail--)

View File

@ -70,7 +70,7 @@ extern char *strcpy __P((char *, const char *));
#endif #endif
#ifndef member #ifndef member
# define member(c, s) ((c) ? ((char *)xstrchr ((s), (c)) != (char *)NULL) : 0) # define member(c, s) ((c) ? ((char *)mbschr ((s), (c)) != (char *)NULL) : 0)
#endif #endif
#ifndef whitespace #ifndef whitespace

View File

@ -177,7 +177,7 @@ hash_search (string, table, flags)
bucket = HASH_BUCKET (string, table, hv); bucket = HASH_BUCKET (string, table, hv);
for (list = table->bucket_array[bucket]; list; list = list->next) for (list = table->bucket_array ? table->bucket_array[bucket] : 0; list; list = list->next)
{ {
if (hv == list->khash && STREQ (list->key, string)) if (hv == list->khash && STREQ (list->key, string))
{ {

22
jobs.c
View File

@ -701,8 +701,8 @@ bgp_delete (pid)
for (prev = p = bgpids.list; p; prev = p, p = p->next) for (prev = p = bgpids.list; p; prev = p, p = p->next)
if (p->pid == pid) if (p->pid == pid)
{ {
prev->next = p->next; /* remove from list */ prev->next = p->next; /* remove from list */
break; break;
} }
if (p == 0) if (p == 0)
@ -1708,6 +1708,10 @@ make_child (command, async_p)
/* Create the child, handle severe errors. Retry on EAGAIN. */ /* Create the child, handle severe errors. Retry on EAGAIN. */
while ((pid = fork ()) < 0 && errno == EAGAIN && forksleep < FORKSLEEP_MAX) while ((pid = fork ()) < 0 && errno == EAGAIN && forksleep < FORKSLEEP_MAX)
{ {
#if 0 /* for bash-4.2 */
/* If we can't create any children, try to reap some dead ones. */
waitchld (-1, 0);
#endif
sys_error ("fork: retry"); sys_error ("fork: retry");
if (sleep (forksleep) != 0) if (sleep (forksleep) != 0)
break; break;
@ -1725,6 +1729,7 @@ make_child (command, async_p)
if (the_pipeline) if (the_pipeline)
kill_current_pipeline (); kill_current_pipeline ();
last_command_exit_value = EX_NOEXEC;
throw_to_top_level (); /* Reset signals, etc. */ throw_to_top_level (); /* Reset signals, etc. */
} }
@ -2371,6 +2376,8 @@ wait_for (pid)
if (interactive && job_control == 0) if (interactive && job_control == 0)
QUIT; QUIT;
/* Check for terminating signals and exit the shell if we receive one */
CHECK_TERMSIG;
/* If we say wait_for (), then we have a record of this child somewhere. /* If we say wait_for (), then we have a record of this child somewhere.
If it and none of its peers are running, don't call waitchld(). */ If it and none of its peers are running, don't call waitchld(). */
@ -2449,6 +2456,8 @@ wait_for (pid)
old SIGINT signal handler. */ old SIGINT signal handler. */
if (interactive && job_control == 0) if (interactive && job_control == 0)
QUIT; QUIT;
/* Check for terminating signals and exit the shell if we receive one */
CHECK_TERMSIG;
} }
while (PRUNNING (child) || (job != NO_JOB && RUNNING (job))); while (PRUNNING (child) || (job != NO_JOB && RUNNING (job)));
@ -3042,8 +3051,15 @@ waitchld (wpid, block)
: 0; : 0;
if (sigchld || block == 0) if (sigchld || block == 0)
waitpid_flags |= WNOHANG; waitpid_flags |= WNOHANG;
/* Check for terminating signals and exit the shell if we receive one */
CHECK_TERMSIG; CHECK_TERMSIG;
if (block == 1 && queue_sigchld == 0 && (waitpid_flags & WNOHANG) == 0)
{
internal_warning (_("waitchld: turning on WNOHANG to avoid indefinite block"));
waitpid_flags |= WNOHANG;
}
pid = WAITPID (-1, &status, waitpid_flags); pid = WAITPID (-1, &status, waitpid_flags);
/* WCONTINUED may be rejected by waitpid as invalid even when defined */ /* WCONTINUED may be rejected by waitpid as invalid even when defined */
@ -3137,7 +3153,7 @@ waitchld (wpid, block)
if (job_control && signal_is_trapped (SIGCHLD) && children_exited && if (job_control && signal_is_trapped (SIGCHLD) && children_exited &&
trap_list[SIGCHLD] != (char *)IGNORE_SIG) trap_list[SIGCHLD] != (char *)IGNORE_SIG)
{ {
if (this_shell_builtin && this_shell_builtin == wait_builtin) if (posixly_correct && this_shell_builtin && this_shell_builtin == wait_builtin)
{ {
interrupt_immediately = 0; interrupt_immediately = 0;
trap_handler (SIGCHLD); /* set pending_traps[SIGCHLD] */ trap_handler (SIGCHLD); /* set pending_traps[SIGCHLD] */

View File

@ -246,7 +246,8 @@ udequote_pathname (pathname)
if (pathname[i - 1] == 0) if (pathname[i - 1] == 0)
break; break;
} }
pathname[j] = '\0'; if (pathname)
pathname[j] = '\0';
} }
#if HANDLE_MULTIBYTE #if HANDLE_MULTIBYTE
@ -279,7 +280,8 @@ wdequote_pathname (pathname)
if (wpathname[i - 1] == L'\0') if (wpathname[i - 1] == L'\0')
break; break;
} }
wpathname[j] = L'\0'; if (wpathname)
wpathname[j] = L'\0';
/* Convert the wide character string into unibyte character set. */ /* Convert the wide character string into unibyte character set. */
memset (&ps, '\0', sizeof(mbstate_t)); memset (&ps, '\0', sizeof(mbstate_t));
@ -307,9 +309,9 @@ dequote_pathname (pathname)
# define GLOB_TESTNAME(name) (lstat (name, &finfo)) # define GLOB_TESTNAME(name) (lstat (name, &finfo))
#else /* !HAVE_LSTAT */ #else /* !HAVE_LSTAT */
# if !defined (AFS) # if !defined (AFS)
# define GLOB_TESTNAME(name) (sh_eaccess (nextname, F_OK)) # define GLOB_TESTNAME(name) (sh_eaccess (name, F_OK))
# else /* AFS */ # else /* AFS */
# define GLOB_TESTNAME(name) (access (nextname, F_OK)) # define GLOB_TESTNAME(name) (access (name, F_OK))
# endif /* AFS */ # endif /* AFS */
#endif /* !HAVE_LSTAT */ #endif /* !HAVE_LSTAT */
@ -320,6 +322,7 @@ glob_testdir (dir)
{ {
struct stat finfo; struct stat finfo;
/*itrace("glob_testdir: testing %s", dir);*/
if (stat (dir, &finfo) < 0) if (stat (dir, &finfo) < 0)
return (-1); return (-1);
@ -426,13 +429,14 @@ glob_vector (pat, dir, flags)
register struct globval *nextlink; register struct globval *nextlink;
register char *nextname, *npat, *subdir; register char *nextname, *npat, *subdir;
unsigned int count; unsigned int count;
int lose, skip, ndirs, isdir, sdlen, add_current; int lose, skip, ndirs, isdir, sdlen, add_current, patlen;
register char **name_vector; register char **name_vector;
register unsigned int i; register unsigned int i;
int mflags; /* Flags passed to strmatch (). */ int mflags; /* Flags passed to strmatch (). */
int pflags; /* flags passed to sh_makepath () */ int pflags; /* flags passed to sh_makepath () */
int nalloca; int nalloca;
struct globval *firstmalloc, *tmplink; struct globval *firstmalloc, *tmplink;
char *convfn;
lastlink = 0; lastlink = 0;
count = lose = skip = add_current = 0; count = lose = skip = add_current = 0;
@ -466,6 +470,8 @@ glob_vector (pat, dir, flags)
skip = 1; skip = 1;
} }
patlen = strlen (pat);
/* If the filename pattern (PAT) does not contain any globbing characters, /* If the filename pattern (PAT) does not contain any globbing characters,
we can dispense with reading the directory, and just see if there is we can dispense with reading the directory, and just see if there is
a filename `DIR/PAT'. If there is, and we can access it, just make the a filename `DIR/PAT'. If there is, and we can access it, just make the
@ -479,8 +485,8 @@ glob_vector (pat, dir, flags)
return ((char **) &glob_error_return); return ((char **) &glob_error_return);
dirlen = strlen (dir); dirlen = strlen (dir);
nextname = (char *)malloc (dirlen + strlen (pat) + 2); nextname = (char *)malloc (dirlen + patlen + 2);
npat = (char *)malloc (strlen (pat) + 1); npat = (char *)malloc (patlen + 1);
if (nextname == 0 || npat == 0) if (nextname == 0 || npat == 0)
lose = 1; lose = 1;
else else
@ -633,8 +639,9 @@ glob_vector (pat, dir, flags)
++count; ++count;
continue; continue;
} }
if (strmatch (pat, dp->d_name, mflags) != FNM_NOMATCH) convfn = fnx_fromfs (dp->d_name, D_NAMLEN (dp));
if (strmatch (pat, convfn, mflags) != FNM_NOMATCH)
{ {
if (nalloca < ALLOCA_MAX) if (nalloca < ALLOCA_MAX)
{ {
@ -1023,7 +1030,7 @@ glob_filename (pathname, flags)
dflags |= GX_ALLDIRS|GX_ADDCURDIR; dflags |= GX_ALLDIRS|GX_ADDCURDIR;
#if 0 #if 0
/* If we want all directories (dflags & GX_ALLDIRS) and we're not /* If we want all directories (dflags & GX_ALLDIRS) and we're not
being called recursively as something like `echo **/*.o' being called recursively as something like `echo [star][star]/[star].o'
((flags & GX_ALLDIRS) == 0), we want to prevent glob_vector from ((flags & GX_ALLDIRS) == 0), we want to prevent glob_vector from
adding a null directory name to the front of the temp_results adding a null directory name to the front of the temp_results
array. We turn off ADDCURDIR if not called recursively and array. We turn off ADDCURDIR if not called recursively and

View File

@ -418,6 +418,13 @@ rl_generic_bind (type, keyseq, data, map)
{ {
map = FUNCTION_TO_KEYMAP (map, ic); map = FUNCTION_TO_KEYMAP (map, ic);
ic = ANYOTHERKEY; ic = ANYOTHERKEY;
/* If we're trying to override a keymap with a null function
(e.g., trying to unbind it), we can't use a null pointer
here because that's indistinguishable from having not been
overridden. We use a special bindable function that does
nothing. */
if (type == ISFUNC && data == 0)
data = (char *)_rl_null_function;
} }
map[ic].function = KEYMAP_TO_FUNCTION (data); map[ic].function = KEYMAP_TO_FUNCTION (data);
@ -1419,7 +1426,9 @@ static const struct {
{ "completion-ignore-case", &_rl_completion_case_fold, 0 }, { "completion-ignore-case", &_rl_completion_case_fold, 0 },
{ "convert-meta", &_rl_convert_meta_chars_to_ascii, 0 }, { "convert-meta", &_rl_convert_meta_chars_to_ascii, 0 },
{ "disable-completion", &rl_inhibit_completion, 0 }, { "disable-completion", &rl_inhibit_completion, 0 },
{ "echo-control-characters", &_rl_echo_control_chars, 0 },
{ "enable-keypad", &_rl_enable_keypad, 0 }, { "enable-keypad", &_rl_enable_keypad, 0 },
{ "enable-meta-key", &_rl_enable_meta, 0 },
{ "expand-tilde", &rl_complete_with_tilde_expansion, 0 }, { "expand-tilde", &rl_complete_with_tilde_expansion, 0 },
{ "history-preserve-point", &_rl_history_preserve_point, 0 }, { "history-preserve-point", &_rl_history_preserve_point, 0 },
{ "horizontal-scroll-mode", &_rl_horizontal_scroll_mode, 0 }, { "horizontal-scroll-mode", &_rl_horizontal_scroll_mode, 0 },
@ -1436,6 +1445,7 @@ static const struct {
{ "revert-all-at-newline", &_rl_revert_all_at_newline, 0 }, { "revert-all-at-newline", &_rl_revert_all_at_newline, 0 },
{ "show-all-if-ambiguous", &_rl_complete_show_all, 0 }, { "show-all-if-ambiguous", &_rl_complete_show_all, 0 },
{ "show-all-if-unmodified", &_rl_complete_show_unmodified, 0 }, { "show-all-if-unmodified", &_rl_complete_show_unmodified, 0 },
{ "skip-completed-text", &_rl_skip_completed_text, 0 },
#if defined (VISIBLE_STATS) #if defined (VISIBLE_STATS)
{ "visible-stats", &rl_visible_stats, 0 }, { "visible-stats", &rl_visible_stats, 0 },
#endif /* VISIBLE_STATS */ #endif /* VISIBLE_STATS */

View File

@ -179,6 +179,12 @@ int _rl_completion_prefix_display_length = 0;
int rl_visible_stats = 0; int rl_visible_stats = 0;
#endif /* VISIBLE_STATS */ #endif /* VISIBLE_STATS */
/* If non-zero, when completing in the middle of a word, don't insert
characters from the match that match characters following point in
the word. This means, for instance, completing when the cursor is
after the `e' in `Makefile' won't result in `Makefilefile'. */
int _rl_skip_completed_text = 0;
/* If non-zero, then this is the address of a function to call when /* If non-zero, then this is the address of a function to call when
completing on a directory name. The function is called with completing on a directory name. The function is called with
the address of a string (the current directory name) as an arg. */ the address of a string (the current directory name) as an arg. */
@ -186,6 +192,17 @@ rl_icppfunc_t *rl_directory_completion_hook = (rl_icppfunc_t *)NULL;
rl_icppfunc_t *rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL; rl_icppfunc_t *rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL;
/* If non-zero, this is the address of a function to call when reading
directory entries from the filesystem for completion and comparing
them to the partial word to be completed. The function should
either return its first argument (if no conversion takes place) or
newly-allocated memory. This can, for instance, convert filenames
between character sets for comparison against what's typed at the
keyboard. The returned value is what is added to the list of
matches. The second argument is the length of the filename to be
converted. */
rl_dequote_func_t *rl_filename_rewrite_hook = (rl_dequote_func_t *)NULL;
/* Non-zero means readline completion functions perform tilde expansion. */ /* Non-zero means readline completion functions perform tilde expansion. */
int rl_complete_with_tilde_expansion = 0; int rl_complete_with_tilde_expansion = 0;
@ -1021,7 +1038,8 @@ gen_completion_matches (text, start, end, our_func, found_quote, quote_char)
{ {
_rl_interrupt_immediately++; _rl_interrupt_immediately++;
matches = (*rl_attempted_completion_function) (text, start, end); matches = (*rl_attempted_completion_function) (text, start, end);
_rl_interrupt_immediately--; if (_rl_interrupt_immediately > 0)
_rl_interrupt_immediately--;
if (matches || rl_attempted_completion_over) if (matches || rl_attempted_completion_over)
{ {
@ -1551,8 +1569,9 @@ insert_match (match, start, mtype, qc)
int start, mtype; int start, mtype;
char *qc; char *qc;
{ {
char *replacement; char *replacement, *r;
char oqc; char oqc;
int end, rlen;
oqc = qc ? *qc : '\0'; oqc = qc ? *qc : '\0';
replacement = make_quoted_replacement (match, mtype, qc); replacement = make_quoted_replacement (match, mtype, qc);
@ -1560,6 +1579,7 @@ insert_match (match, start, mtype, qc)
/* Now insert the match. */ /* Now insert the match. */
if (replacement) if (replacement)
{ {
rlen = strlen (replacement);
/* Don't double an opening quote character. */ /* Don't double an opening quote character. */
if (qc && *qc && start && rl_line_buffer[start - 1] == *qc && if (qc && *qc && start && rl_line_buffer[start - 1] == *qc &&
replacement[0] == *qc) replacement[0] == *qc)
@ -1569,7 +1589,24 @@ insert_match (match, start, mtype, qc)
else if (qc && (*qc != oqc) && start && rl_line_buffer[start - 1] == oqc && else if (qc && (*qc != oqc) && start && rl_line_buffer[start - 1] == oqc &&
replacement[0] != oqc) replacement[0] != oqc)
start--; start--;
_rl_replace_text (replacement, start, rl_point - 1); end = rl_point - 1;
/* Don't double a closing quote character */
if (qc && *qc && end && rl_line_buffer[rl_point] == *qc && replacement[rlen - 1] == *qc)
end++;
if (_rl_skip_completed_text)
{
r = replacement;
while (start < rl_end && *r && rl_line_buffer[start] == *r)
{
start++;
r++;
}
if (start <= end || *r)
_rl_replace_text (r, start, end);
rl_point = start + strlen (r);
}
else
_rl_replace_text (replacement, start, end);
if (replacement != match) if (replacement != match)
free (replacement); free (replacement);
} }
@ -1893,7 +1930,8 @@ rl_completion_matches (text, entry_function)
match_list[++matches] = string; match_list[++matches] = string;
match_list[matches + 1] = (char *)NULL; match_list[matches + 1] = (char *)NULL;
} }
_rl_interrupt_immediately--; if (_rl_interrupt_immediately > 0)
_rl_interrupt_immediately--;
/* If there were any matches, then look through them finding out the /* If there were any matches, then look through them finding out the
lowest common denominator. That then becomes match_list[0]. */ lowest common denominator. That then becomes match_list[0]. */
@ -1981,8 +2019,8 @@ rl_filename_completion_function (text, state)
static char *dirname = (char *)NULL; static char *dirname = (char *)NULL;
static char *users_dirname = (char *)NULL; static char *users_dirname = (char *)NULL;
static int filename_len; static int filename_len;
char *temp; char *temp, *dentry, *convfn;
int dirlen; int dirlen, dentlen, convlen;
struct dirent *entry; struct dirent *entry;
/* If we don't have any state, then do some initialization. */ /* If we don't have any state, then do some initialization. */
@ -2086,6 +2124,15 @@ rl_filename_completion_function (text, state)
entry = (struct dirent *)NULL; entry = (struct dirent *)NULL;
while (directory && (entry = readdir (directory))) while (directory && (entry = readdir (directory)))
{ {
convfn = dentry = entry->d_name;
convlen = dentlen = D_NAMLEN (entry);
if (rl_filename_rewrite_hook)
{
convfn = (*rl_filename_rewrite_hook) (dentry, dentlen);
convlen = (convfn == dentry) ? dentlen : strlen (convfn);
}
/* Special case for no filename. If the user has disabled the /* Special case for no filename. If the user has disabled the
`match-hidden-files' variable, skip filenames beginning with `.'. `match-hidden-files' variable, skip filenames beginning with `.'.
All other entries except "." and ".." match. */ All other entries except "." and ".." match. */
@ -2094,9 +2141,8 @@ rl_filename_completion_function (text, state)
if (_rl_match_hidden_files == 0 && HIDDEN_FILE (entry->d_name)) if (_rl_match_hidden_files == 0 && HIDDEN_FILE (entry->d_name))
continue; continue;
if (entry->d_name[0] != '.' || if (convfn[0] != '.' ||
(entry->d_name[1] && (convfn[1] && (convfn[1] != '.' || convfn[2])))
(entry->d_name[1] != '.' || entry->d_name[2])))
break; break;
} }
else else
@ -2105,16 +2151,16 @@ rl_filename_completion_function (text, state)
it is a match. */ it is a match. */
if (_rl_completion_case_fold) if (_rl_completion_case_fold)
{ {
if ((_rl_to_lower (entry->d_name[0]) == _rl_to_lower (filename[0])) && if ((_rl_to_lower (convfn[0]) == _rl_to_lower (filename[0])) &&
(((int)D_NAMLEN (entry)) >= filename_len) && (convlen >= filename_len) &&
(_rl_strnicmp (filename, entry->d_name, filename_len) == 0)) (_rl_strnicmp (filename, convfn, filename_len) == 0))
break; break;
} }
else else
{ {
if ((entry->d_name[0] == filename[0]) && if ((convfn[0] == filename[0]) &&
(((int)D_NAMLEN (entry)) >= filename_len) && (convlen >= filename_len) &&
(strncmp (filename, entry->d_name, filename_len) == 0)) (strncmp (filename, convfn, filename_len) == 0))
break; break;
} }
} }
@ -2176,19 +2222,22 @@ rl_filename_completion_function (text, state)
strcpy (temp + dirlen, entry->d_name); strcpy (temp + dirlen, entry->d_name);
} }
else else
temp = savestring (entry->d_name); temp = savestring (convfn);
if (convfn != dentry)
free (convfn);
return (temp); return (temp);
} }
} }
/* An initial implementation of a menu completion function a la tcsh. The /* An initial implementation of a menu completion function a la tcsh. The
first time (if the last readline command was not rl_menu_complete), we first time (if the last readline command was not rl_old_menu_complete), we
generate the list of matches. This code is very similar to the code in generate the list of matches. This code is very similar to the code in
rl_complete_internal -- there should be a way to combine the two. Then, rl_complete_internal -- there should be a way to combine the two. Then,
for each item in the list of matches, we insert the match in an undoable for each item in the list of matches, we insert the match in an undoable
fashion, with the appropriate character appended (this happens on the fashion, with the appropriate character appended (this happens on the
second and subsequent consecutive calls to rl_menu_complete). When we second and subsequent consecutive calls to rl_old_menu_complete). When we
hit the end of the match list, we restore the original unmatched text, hit the end of the match list, we restore the original unmatched text,
ring the bell, and reset the counter to zero. */ ring the bell, and reset the counter to zero. */
int int
@ -2330,7 +2379,7 @@ rl_menu_complete (count, ignore)
/* The first time through, we generate the list of matches and set things /* The first time through, we generate the list of matches and set things
up to insert them. */ up to insert them. */
if (rl_last_func != rl_menu_complete || full_completion) if ((rl_last_func != rl_menu_complete && rl_last_func != rl_backward_menu_complete) || full_completion)
{ {
/* Clean up from previous call, if any. */ /* Clean up from previous call, if any. */
FREE (orig_text); FREE (orig_text);
@ -2470,3 +2519,12 @@ rl_menu_complete (count, ignore)
completion_changed_buffer = 1; completion_changed_buffer = 1;
return (0); return (0);
} }
int
rl_backward_menu_complete (count, key)
int count, key;
{
/* Positive arguments to backward-menu-complete translate into negative
arguments for menu-complete, and vice versa. */
return (rl_menu_complete (-count, key));
}

View File

@ -94,9 +94,9 @@ static int line_structures_initialized = 0;
#define invisible_line (line_state_invisible->line) #define invisible_line (line_state_invisible->line)
#if defined (HANDLE_MULTIBYTE) #if defined (HANDLE_MULTIBYTE)
static int _rl_col_width PARAMS((const char *, int, int)); static int _rl_col_width PARAMS((const char *, int, int, int));
#else #else
# define _rl_col_width(l, s, e) (((e) <= (s)) ? 0 : (e) - (s)) # define _rl_col_width(l, s, e, f) (((e) <= (s)) ? 0 : (e) - (s))
#endif #endif
/* Heuristic used to decide whether it is faster to move from CUR to NEW /* Heuristic used to decide whether it is faster to move from CUR to NEW
@ -312,7 +312,7 @@ expand_prompt (pmt, lp, lip, niflp, vlp)
not be the same as the number of physical characters not be the same as the number of physical characters
on the screen in the presence of multibyte characters */ on the screen in the presence of multibyte characters */
rl += ind - pind; rl += ind - pind;
physchars += _rl_col_width (pmt, pind, ind); physchars += _rl_col_width (pmt, pind, ind, 0);
} }
else else
ninvis += ind - pind; ninvis += ind - pind;
@ -688,7 +688,7 @@ rl_redisplay ()
temp = local_prompt_len; temp = local_prompt_len;
while (num < temp) while (num < temp)
{ {
z = _rl_col_width (local_prompt, n0, num); z = _rl_col_width (local_prompt, n0, num, 1);
if (z > _rl_screenwidth) if (z > _rl_screenwidth)
{ {
num = _rl_find_prev_mbchar (local_prompt, num, MB_FIND_ANY); num = _rl_find_prev_mbchar (local_prompt, num, MB_FIND_ANY);
@ -714,7 +714,7 @@ rl_redisplay ()
inv_lbreaks[++newlines] = temp; inv_lbreaks[++newlines] = temp;
#if defined (HANDLE_MULTIBYTE) #if defined (HANDLE_MULTIBYTE)
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0 && prompt_multibyte_chars > 0) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0 && prompt_multibyte_chars > 0)
lpos -= _rl_col_width (local_prompt, n0, num); lpos -= _rl_col_width (local_prompt, n0, num, 1);
else else
#endif #endif
lpos -= _rl_screenwidth; lpos -= _rl_screenwidth;
@ -733,6 +733,7 @@ rl_redisplay ()
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
{ {
memset (&ps, 0, sizeof (mbstate_t)); memset (&ps, 0, sizeof (mbstate_t));
/* XXX - what if wc_bytes ends up <= 0? check for MB_INVALIDCH */
wc_bytes = mbrtowc (&wc, rl_line_buffer, rl_end, &ps); wc_bytes = mbrtowc (&wc, rl_line_buffer, rl_end, &ps);
} }
else else
@ -893,6 +894,7 @@ rl_redisplay ()
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
{ {
in += wc_bytes; in += wc_bytes;
/* XXX - what if wc_bytes ends up <= 0? check for MB_INVALIDCH */
wc_bytes = mbrtowc (&wc, rl_line_buffer + in, rl_end - in, &ps); wc_bytes = mbrtowc (&wc, rl_line_buffer + in, rl_end - in, &ps);
} }
else else
@ -958,6 +960,11 @@ rl_redisplay ()
#define VIS_LINE(line) ((line) > _rl_vis_botlin) ? "" : VIS_CHARS(line) #define VIS_LINE(line) ((line) > _rl_vis_botlin) ? "" : VIS_CHARS(line)
#define INV_LINE(line) (invisible_line + inv_lbreaks[line]) #define INV_LINE(line) (invisible_line + inv_lbreaks[line])
#define OLD_CPOS_IN_PROMPT() (cpos_adjusted == 0 && \
_rl_last_c_pos != o_cpos && \
_rl_last_c_pos > wrap_offset && \
o_cpos < prompt_last_invisible)
/* For each line in the buffer, do the updating display. */ /* For each line in the buffer, do the updating display. */
for (linenum = 0; linenum <= inv_botlin; linenum++) for (linenum = 0; linenum <= inv_botlin; linenum++)
{ {
@ -980,11 +987,7 @@ rl_redisplay ()
time update_line is called, then we can assume in our time update_line is called, then we can assume in our
calculations that o_cpos does not need to be adjusted by calculations that o_cpos does not need to be adjusted by
wrap_offset. */ wrap_offset. */
if (linenum == 0 && (MB_CUR_MAX > 1 && rl_byte_oriented == 0) && if (linenum == 0 && (MB_CUR_MAX > 1 && rl_byte_oriented == 0) && OLD_CPOS_IN_PROMPT())
cpos_adjusted == 0 &&
_rl_last_c_pos != o_cpos &&
_rl_last_c_pos > wrap_offset &&
o_cpos < prompt_last_invisible)
_rl_last_c_pos -= prompt_invis_chars_first_line; /* XXX - was wrap_offset */ _rl_last_c_pos -= prompt_invis_chars_first_line; /* XXX - was wrap_offset */
else if (linenum == prompt_last_screen_line && prompt_physical_chars > _rl_screenwidth && else if (linenum == prompt_last_screen_line && prompt_physical_chars > _rl_screenwidth &&
(MB_CUR_MAX > 1 && rl_byte_oriented == 0) && (MB_CUR_MAX > 1 && rl_byte_oriented == 0) &&
@ -1084,7 +1087,7 @@ rl_redisplay ()
_rl_output_some_chars (local_prompt, nleft); _rl_output_some_chars (local_prompt, nleft);
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
_rl_last_c_pos = _rl_col_width (local_prompt, 0, nleft) - wrap_offset + modmark; _rl_last_c_pos = _rl_col_width (local_prompt, 0, nleft, 1) - wrap_offset + modmark;
else else
_rl_last_c_pos = nleft + modmark; _rl_last_c_pos = nleft + modmark;
} }
@ -1108,7 +1111,7 @@ rl_redisplay ()
{ {
/* TX == new physical cursor position in multibyte locale. */ /* TX == new physical cursor position in multibyte locale. */
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
tx = _rl_col_width (&visible_line[pos], 0, nleft) - visible_wrap_offset; tx = _rl_col_width (&visible_line[pos], 0, nleft, 1) - visible_wrap_offset;
else else
tx = nleft; tx = nleft;
if (tx >= 0 && _rl_last_c_pos > tx) if (tx >= 0 && _rl_last_c_pos > tx)
@ -1201,12 +1204,8 @@ rl_redisplay ()
_rl_screenwidth + (lmargin ? 0 : wrap_offset), _rl_screenwidth + (lmargin ? 0 : wrap_offset),
0); 0);
if ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) && if ((MB_CUR_MAX > 1 && rl_byte_oriented == 0) && OLD_CPOS_IN_PROMPT())
cpos_adjusted == 0 && _rl_last_c_pos -= prompt_invis_chars_first_line; /* XXX - was wrap_offset */
_rl_last_c_pos != o_cpos &&
_rl_last_c_pos > wrap_offset &&
o_cpos < prompt_last_invisible)
_rl_last_c_pos -= prompt_invis_chars_first_line; /* XXX - was wrap_offset */
/* If the visible new line is shorter than the old, but the number /* If the visible new line is shorter than the old, but the number
of invisible characters is greater, and we are at the end of of invisible characters is greater, and we are at the end of
@ -1320,7 +1319,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
if (tempwidth > 0) if (tempwidth > 0)
{ {
int count; int count, i;
bytes = ret; bytes = ret;
for (count = 0; count < bytes; count++) for (count = 0; count < bytes; count++)
putc (new[count], rl_outstream); putc (new[count], rl_outstream);
@ -1331,10 +1330,13 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
if (ret != 0 && bytes != 0) if (ret != 0 && bytes != 0)
{ {
if (MB_INVALIDCH (ret)) if (MB_INVALIDCH (ret))
memmove (old+bytes, old+1, strlen (old+1)); ret = 1;
else memmove (old+bytes, old+ret, strlen (old+ret));
memmove (old+bytes, old+ret, strlen (old+ret));
memcpy (old, new, bytes); memcpy (old, new, bytes);
/* Fix up indices if we copy data from one line to another */
omax += bytes - ret;
for (i = current_line+1; i < inv_botlin+1; i++)
vis_lbreaks[i] += bytes - ret;
} }
} }
else else
@ -1528,7 +1530,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
{ {
/* We take wrap_offset into account here so we can pass correct /* We take wrap_offset into account here so we can pass correct
information to _rl_move_cursor_relative. */ information to _rl_move_cursor_relative. */
_rl_last_c_pos = _rl_col_width (local_prompt, 0, lendiff) - wrap_offset + modmark; _rl_last_c_pos = _rl_col_width (local_prompt, 0, lendiff, 1) - wrap_offset + modmark;
cpos_adjusted = 1; cpos_adjusted = 1;
} }
else else
@ -1559,7 +1561,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
When not using multibyte characters, these are equal */ When not using multibyte characters, these are equal */
lendiff = (nls - nfd) - (ols - ofd); lendiff = (nls - nfd) - (ols - ofd);
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
col_lendiff = _rl_col_width (new, nfd - new, nls - new) - _rl_col_width (old, ofd - old, ols - old); col_lendiff = _rl_col_width (new, nfd - new, nls - new, 1) - _rl_col_width (old, ofd - old, ols - old, 1);
else else
col_lendiff = lendiff; col_lendiff = lendiff;
@ -1584,7 +1586,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
/* Insert (diff (len (old), len (new)) ch. */ /* Insert (diff (len (old), len (new)) ch. */
temp = ne - nfd; temp = ne - nfd;
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
col_temp = _rl_col_width (new, nfd - new, ne - new); col_temp = _rl_col_width (new, nfd - new, ne - new, 1);
else else
col_temp = temp; col_temp = temp;
@ -1601,7 +1603,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
if (lendiff < 0) if (lendiff < 0)
{ {
_rl_output_some_chars (nfd, temp); _rl_output_some_chars (nfd, temp);
_rl_last_c_pos += _rl_col_width (nfd, 0, temp); _rl_last_c_pos += _rl_col_width (nfd, 0, temp, 1);
/* If nfd begins before any invisible characters in the prompt, /* If nfd begins before any invisible characters in the prompt,
adjust _rl_last_c_pos to account for wrap_offset and set adjust _rl_last_c_pos to account for wrap_offset and set
cpos_adjusted to let the caller know. */ cpos_adjusted to let the caller know. */
@ -1679,7 +1681,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
multibyte characters and prompt strings with invisible multibyte characters and prompt strings with invisible
characters, but was previously disabled. */ characters, but was previously disabled. */
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
twidth = _rl_col_width (nfd+lendiff, 0, temp-col_lendiff); twidth = _rl_col_width (nfd+lendiff, 0, temp-col_lendiff, 1);
else else
twidth = temp - lendiff; twidth = temp - lendiff;
_rl_last_c_pos += twidth; _rl_last_c_pos += twidth;
@ -1738,7 +1740,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
_rl_output_some_chars (nfd, temp); _rl_output_some_chars (nfd, temp);
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
{ {
_rl_last_c_pos += _rl_col_width (nfd, 0, temp); _rl_last_c_pos += _rl_col_width (nfd, 0, temp, 1);
if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible)) if (current_line == 0 && wrap_offset && ((nfd - new) <= prompt_last_invisible))
{ {
_rl_last_c_pos -= wrap_offset; _rl_last_c_pos -= wrap_offset;
@ -1771,7 +1773,7 @@ update_line (old, new, current_line, omax, nmax, inv_botlin)
} }
lendiff = (oe - old) - (ne - new); lendiff = (oe - old) - (ne - new);
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
col_lendiff = _rl_col_width (old, 0, oe - old) - _rl_col_width (new, 0, ne - new); col_lendiff = _rl_col_width (old, 0, oe - old, 1) - _rl_col_width (new, 0, ne - new, 1);
else else
col_lendiff = lendiff; col_lendiff = lendiff;
@ -1838,7 +1840,7 @@ rl_on_new_line_with_prompt ()
l = strlen (prompt_last_line); l = strlen (prompt_last_line);
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
_rl_last_c_pos = _rl_col_width (prompt_last_line, 0, l); /* XXX */ _rl_last_c_pos = _rl_col_width (prompt_last_line, 0, l, 1); /* XXX */
else else
_rl_last_c_pos = l; _rl_last_c_pos = l;
@ -1900,6 +1902,7 @@ _rl_move_cursor_relative (new, data)
register int i; register int i;
int woff; /* number of invisible chars on current line */ int woff; /* number of invisible chars on current line */
int cpos, dpos; /* current and desired cursor positions */ int cpos, dpos; /* current and desired cursor positions */
int adjust;
woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset); woff = WRAP_OFFSET (_rl_last_v_pos, wrap_offset);
cpos = _rl_last_c_pos; cpos = _rl_last_c_pos;
@ -1915,15 +1918,34 @@ _rl_move_cursor_relative (new, data)
as long as we are past them and they are counted by _rl_col_width. */ as long as we are past them and they are counted by _rl_col_width. */
if (MB_CUR_MAX > 1 && rl_byte_oriented == 0) if (MB_CUR_MAX > 1 && rl_byte_oriented == 0)
{ {
dpos = _rl_col_width (data, 0, new); adjust = 1;
/* Try to short-circuit common cases and eliminate a bunch of multibyte
character function calls. */
/* 1. prompt string */
if (new == local_prompt_len && memcmp (data, local_prompt, new) == 0)
{
dpos = prompt_physical_chars;
cpos_adjusted = 1;
adjust = 0;
}
/* 2. prompt_string + line contents */
else if (new > local_prompt_len && local_prompt && memcmp (data, local_prompt, local_prompt_len) == 0)
{
dpos = prompt_physical_chars + _rl_col_width (data, local_prompt_len, new, 1);
cpos_adjusted = 1;
adjust = 0;
}
else
dpos = _rl_col_width (data, 0, new, 1);
/* Use NEW when comparing against the last invisible character in the /* Use NEW when comparing against the last invisible character in the
prompt string, since they're both buffer indices and DPOS is a prompt string, since they're both buffer indices and DPOS is a
desired display position. */ desired display position. */
if ((new > prompt_last_invisible) || /* XXX - don't use woff here */ if (adjust && ((new > prompt_last_invisible) || /* XXX - don't use woff here */
(prompt_physical_chars >= _rl_screenwidth && (prompt_physical_chars >= _rl_screenwidth &&
_rl_last_v_pos == prompt_last_screen_line && _rl_last_v_pos == prompt_last_screen_line &&
wrap_offset >= woff && dpos >= woff && wrap_offset >= woff && dpos >= woff &&
new > (prompt_last_invisible-(_rl_screenwidth*_rl_last_v_pos)-wrap_offset))) new > (prompt_last_invisible-(_rl_screenwidth*_rl_last_v_pos)-wrap_offset))))
/* XXX last comparison might need to be >= */ /* XXX last comparison might need to be >= */
{ {
dpos -= woff; dpos -= woff;
@ -2566,9 +2588,9 @@ _rl_current_display_line ()
In the case of multibyte characters with stateful encoding, we have to In the case of multibyte characters with stateful encoding, we have to
scan from the beginning of the string to take the state into account. */ scan from the beginning of the string to take the state into account. */
static int static int
_rl_col_width (str, start, end) _rl_col_width (str, start, end, flags)
const char *str; const char *str;
int start, end; int start, end, flags;
{ {
wchar_t wc; wchar_t wc;
mbstate_t ps; mbstate_t ps;
@ -2587,6 +2609,20 @@ _rl_ttymsg ("_rl_col_width: called with MB_CUR_MAX == 1");
point = 0; point = 0;
max = end; max = end;
/* Try to short-circuit common cases. The adjustment to remove wrap_offset
is done by the caller. */
/* 1. prompt string */
if (flags && start == 0 && end == local_prompt_len && memcmp (str, local_prompt, local_prompt_len) == 0)
return (prompt_physical_chars + wrap_offset);
/* 2. prompt string + line contents */
else if (flags && start == 0 && local_prompt_len > 0 && end > local_prompt_len && local_prompt && memcmp (str, local_prompt, local_prompt_len) == 0)
{
tmp = prompt_physical_chars + wrap_offset;
/* XXX - try to call ourselves recursively with non-prompt portion */
tmp += _rl_col_width (str, local_prompt_len, end, flags);
return (tmp);
}
while (point < start) while (point < start)
{ {
tmp = mbrlen (str + point, max, &ps); tmp = mbrlen (str + point, max, &ps);

View File

@ -1,12 +1,12 @@
@c The GNU Free Documentation License. @c The GNU Free Documentation License.
@center Version 1.2, November 2002 @center Version 1.3, 3 November 2008
@c This file is intended to be included within another document, @c This file is intended to be included within another document,
@c hence no sectioning command or @node. @c hence no sectioning command or @node.
@display @display
Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc. Copyright @copyright{} 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA @uref{http://fsf.org/}
Everyone is permitted to copy and distribute verbatim copies Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed. of this license document, but changing it is not allowed.
@ -111,6 +111,9 @@ 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, the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text. preceding the beginning of the body of the text.
The ``publisher'' means any person or entity that distributes copies
of the Document to the public.
A section ``Entitled XYZ'' means a named subunit of the Document whose A section ``Entitled XYZ'' means a named subunit of the Document whose
title either is precisely XYZ or contains XYZ in parentheses following title either is precisely XYZ or contains XYZ in parentheses following
text that translates XYZ in another language. (Here XYZ stands for a text that translates XYZ in another language. (Here XYZ stands for a
@ -379,13 +382,30 @@ title.
@item @item
TERMINATION TERMINATION
You may not copy, modify, sublicense, or distribute the Document except You may not copy, modify, sublicense, or distribute the Document
as expressly provided for under this License. Any other attempt to except as expressly provided under this License. Any attempt
copy, modify, sublicense or distribute the Document is void, and will otherwise to copy, modify, sublicense, or distribute it is void, and
automatically terminate your rights under this License. However, will automatically terminate your rights under this License.
parties who have received copies, or rights, from you under this
License will not have their licenses terminated so long as such However, if you cease all violation of this License, then your license
parties remain in full compliance. from a particular copyright holder is reinstated (a) provisionally,
unless and until the copyright holder explicitly and finally
terminates your license, and (b) permanently, if the copyright holder
fails to notify you of the violation by some reasonable means prior to
60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, receipt of a copy of some or all of the same material does
not give you any rights to use it.
@item @item
FUTURE REVISIONS OF THIS LICENSE FUTURE REVISIONS OF THIS LICENSE
@ -403,7 +423,42 @@ 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 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 Free Software Foundation. If the Document does not specify a version
number of this License, you may choose any version ever published (not number of this License, you may choose any version ever published (not
as a draft) by the Free Software Foundation. as a draft) by the Free Software Foundation. If the Document
specifies that a proxy can decide which future versions of this
License can be used, that proxy's public statement of acceptance of a
version permanently authorizes you to choose that version for the
Document.
@item
RELICENSING
``Massive Multiauthor Collaboration Site'' (or ``MMC Site'') means any
World Wide Web server that publishes copyrightable works and also
provides prominent facilities for anybody to edit those works. A
public wiki that anybody can edit is an example of such a server. A
``Massive Multiauthor Collaboration'' (or ``MMC'') contained in the
site means any set of copyrightable works thus published on the MMC
site.
``CC-BY-SA'' means the Creative Commons Attribution-Share Alike 3.0
license published by Creative Commons Corporation, a not-for-profit
corporation with a principal place of business in San Francisco,
California, as well as future copyleft versions of that license
published by that same organization.
``Incorporate'' means to publish or republish a Document, in whole or
in part, as part of another Document.
An MMC is ``eligible for relicensing'' if it is licensed under this
License, and if all works that were first published under this License
somewhere other than this MMC, and subsequently incorporated in whole
or in part into the MMC, (1) had no cover texts or invariant sections,
and (2) were thus incorporated prior to November 1, 2008.
The operator of an MMC Site may republish an MMC contained in the site
under CC-BY-SA on the same site at any time before August 1, 2009,
provided the MMC is eligible for relicensing.
@end enumerate @end enumerate
@page @page
@ -417,7 +472,7 @@ license notices just after the title page:
@group @group
Copyright (C) @var{year} @var{your name}. Copyright (C) @var{year} @var{your name}.
Permission is granted to copy, distribute and/or modify this document Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation; or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover 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 Texts. A copy of the license is included in the section entitled ``GNU

View File

@ -20,7 +20,7 @@ are preserved on all copies.
@quotation @quotation
Permission is granted to copy, distribute and/or modify this document Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 or under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no any later version published by the Free Software Foundation; with no
Invariant Sections, with the Front-Cover texts being ``A GNU Manual'', 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 and with the Back-Cover Texts as in (a) below. A copy of the license is

View File

@ -21,7 +21,7 @@ are preserved on all copies.
@quotation @quotation
Permission is granted to copy, distribute and/or modify this document Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 or under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no any later version published by the Free Software Foundation; with no
Invariant Sections, with the Front-Cover texts being ``A GNU Manual'', 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 and with the Back-Cover Texts as in (a) below. A copy of the license is

View File

@ -622,7 +622,7 @@ Readline which keymap to use.
@deftypefun Keymap rl_make_bare_keymap (void) @deftypefun Keymap rl_make_bare_keymap (void)
Returns a new, empty keymap. The space for the keymap is allocated with Returns a new, empty keymap. The space for the keymap is allocated with
@code{malloc()}; the caller should free it by calling @code{malloc()}; the caller should free it by calling
@code{rl_discard_keymap()} when done. @code{rl_free_keymap()} when done.
@end deftypefun @end deftypefun
@deftypefun Keymap rl_copy_keymap (Keymap map) @deftypefun Keymap rl_copy_keymap (Keymap map)
@ -636,7 +636,13 @@ the Meta digits bound to produce numeric arguments.
@end deftypefun @end deftypefun
@deftypefun void rl_discard_keymap (Keymap keymap) @deftypefun void rl_discard_keymap (Keymap keymap)
Free the storage associated with @var{keymap}. Free the storage associated with the data in @var{keymap}.
The caller should free @var{keymap}.
@end deftypefun
@deftypefun void rl_free_keymap (Keymap keymap)
Free all storage associated with @var{keymap}. This calls
@code{rl_discard_keymap} to free subordindate keymaps and macros.
@end deftypefun @end deftypefun
Readline has several internal keymaps. These functions allow you to Readline has several internal keymaps. These functions allow you to
@ -1722,6 +1728,35 @@ remove any quote characters from the directory name, because its result will
be passed directly to @code{opendir()}. be passed directly to @code{opendir()}.
@end deftypevar @end deftypevar
@ignore
@deftypevar extern rl_icppfunc_t *rl_directory_rewrite_hook;
If non-zero, this is the address of a function to call when completing
a directory name. This function takes the address of the directory name
to be modified as an argument. Unlike @code{rl_directory_completion_hook},
it only modifies the directory name used in @code{opendir}, not what is
displayed when the possible completions are printed or inserted. It is
called before rl_directory_completion_hook.
I'm not happy with how this worksyet, so it's undocumented.
@end deftypevar
@end ignore
@deftypevar {rl_dequote_func_t *} rl_filename_rewrite_hook
If non-zero, this is the address of a function called when reading
directory entries from the filesystem for completion and comparing
them to the partial word to be completed. The function should
perform any necesary application or system-specific conversion on
the filename, such as converting between character sets or converting
from a filesystem format to a character input format.
The function takes two arguments: @var{fname}, the filename to be converted,
and @var{fnlen}, its length in bytes.
It must either return its first argument (if no conversion takes place)
or the converted filename in newly-allocated memory. The converted
form is used to compare against the word to be completed, and, if it
matches, is added to the list of matches. Readline will free the
allocated string.
@end deftypevar
@deftypevar {rl_compdisp_func_t *} rl_completion_display_matches_hook @deftypevar {rl_compdisp_func_t *} rl_completion_display_matches_hook
If non-zero, then this is the address of a function to call when 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. completing a word would normally display the list of possible matches.

View File

@ -474,12 +474,23 @@ 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 mode, where the keystrokes are most similar to Emacs. This variable can be
set to either @samp{emacs} or @samp{vi}. set to either @samp{emacs} or @samp{vi}.
@item echo-control-characters
When set to @samp{on}, on operating systems that indicate they support it,
readline echoes a character corresponding to a signal generated from the
keyboard. The default is @samp{on}.
@item enable-keypad @item enable-keypad
@vindex enable-keypad @vindex enable-keypad
When set to @samp{on}, Readline will try to enable the application When set to @samp{on}, Readline will try to enable the application
keypad when it is called. Some systems need this to enable the keypad when it is called. Some systems need this to enable the
arrow keys. The default is @samp{off}. arrow keys. The default is @samp{off}.
@item enable-meta-key
When set to @samp{on}, Readline will try to enable any meta modifier
key the terminal claims to support when it is called. On many terminals,
the meta key is used to send eight-bit characters.
The default is @samp{on}.
@item expand-tilde @item expand-tilde
@vindex expand-tilde @vindex expand-tilde
If set to @samp{on}, tilde expansion is performed when Readline If set to @samp{on}, tilde expansion is performed when Readline
@ -606,6 +617,20 @@ a common prefix) cause the matches to be listed immediately instead
of ringing the bell. of ringing the bell.
The default value is @samp{off}. The default value is @samp{off}.
@item skip-completed-text
@vindex skip-completed-text
If set to @samp{on}, this alters the default completion behavior when
inserting a single match into the line. It's only active when
performing completion in the middle of a word. If enabled, readline
does not insert characters from the completion that match characters
after point in the word being completed, so portions of the word
following the cursor are not duplicated.
For instance, if this is enabled, attempting completion when the cursor
is after the @samp{e} in @samp{Makefile} will result in @samp{Makefile}
rather than @samp{Makefilefile}, assuming there is a single possible
completion.
The default value is @samp{off}.
@item visible-stats @item visible-stats
@vindex visible-stats @vindex visible-stats
If set to @samp{on}, a character denoting a file's type If set to @samp{on}, a character denoting a file's type
@ -1292,6 +1317,11 @@ through the list.
This command is intended to be bound to @key{TAB}, but is unbound This command is intended to be bound to @key{TAB}, but is unbound
by default. by default.
@item menu-complete-backward ()
Identical to @code{menu-complete}, but moves backward through the list
of possible completions, as if @code{menu-complete} had been given a
negative argument.
@item delete-char-or-list () @item delete-char-or-list ()
Deletes the character under the cursor if not at the beginning or Deletes the character under the cursor if not at the beginning or
end of the line (like @code{delete-char}). end of the line (like @code{delete-char}).
@ -1431,6 +1461,15 @@ A character is read and point is moved to the previous occurrence
of that character. A negative count searches for subsequent of that character. A negative count searches for subsequent
occurrences. occurrences.
@item skip-csi-sequence ()
Read enough characters to consume a multi-key sequence such as those
defined for keys like Home and End. Such sequences begin with a
Control Sequence Indicator (CSI), usually ESC-[. If this sequence is
bound to "\e[", keys producing such sequences will have no effect
unless explicitly bound to a readline command, instead of inserting
stray characters into the editing buffer. This is unbound by default,
but usually bound to ESC-[.
@item insert-comment (M-#) @item insert-comment (M-#)
Without a numeric argument, the value of the @code{comment-begin} Without a numeric argument, the value of the @code{comment-begin}
variable is inserted at the beginning of the current line. variable is inserted at the beginning of the current line.
@ -1574,10 +1613,15 @@ the programmable completion facilities are invoked.
First, the command name is identified. First, the command name is identified.
If a compspec has been defined for that command, the If a compspec has been defined for that command, the
compspec is used to generate the list of possible completions for the word. compspec is used to generate the list of possible completions for the word.
If the command word is the empty string (completion attempted at the
beginning of an empty line), any compspec defined with
the @option{-E} option to @code{complete} is used.
If the command word is a full pathname, a compspec for the full If the command word is a full pathname, a compspec for the full
pathname is searched for first. pathname is searched for first.
If no compspec is found for the full pathname, an attempt is made to If no compspec is found for the full pathname, an attempt is made to
find a compspec for the portion following the final slash. find a compspec for the portion following the final slash.
If those searches do not result in a compspec, any compspec defined with
the @option{-D} option to @code{complete} is used as the default.
Once a compspec has been found, it is used to generate the list of Once a compspec has been found, it is used to generate the list of
matching words. matching words.
@ -1681,6 +1725,30 @@ to completed names which are symbolic links to directories, subject to
the value of the @var{mark-directories} Readline variable, regardless the value of the @var{mark-directories} Readline variable, regardless
of the setting of the @var{mark-symlinked-directories} Readline variable. of the setting of the @var{mark-symlinked-directories} Readline variable.
There is some support for dynamically modifying completions. This is
most useful when used in combination with a default completion specified
with @option{-D}. It's possible for shell functions executed as completion
handlers to indicate that completion should be retried by returning an
exit status of 124. If a shell function returns 124, and changes
the compspec associated with the command on which completion is being
attempted (supplied as the first argument when the function is executed),
programmable completion restarts from the beginning, with an
attempt to find a compspec for that command. This allows a set of
completions to be built dynamically as completion is attempted, rather than
being loaded all at once.
For instance, assuming that there is a library of compspecs, each kept in a
file corresponding to the name of the command, the following default
completion function would load completions dynamically:
@example
_completion_loader()
@{
. "/etc/bash_completion.d/$1.sh" >/dev/null 2>&1 && return 124
@}
complete -D -F _completion_loader
@end example
@node Programmable Completion Builtins @node Programmable Completion Builtins
@section Programmable Completion Builtins @section Programmable Completion Builtins
@cindex completion builtins @cindex completion builtins
@ -1716,10 +1784,10 @@ matches were generated.
@item complete @item complete
@btindex complete @btindex complete
@example @example
@code{complete [-abcdefgjksuv] [-o @var{comp-option}] [-E] [-A @var{action}] [-G @var{globpat}] [-W @var{wordlist}] @code{complete [-abcdefgjksuv] [-o @var{comp-option}] [-DE] [-A @var{action}] [-G @var{globpat}] [-W @var{wordlist}]
[-F @var{function}] [-C @var{command}] [-X @var{filterpat}] [-F @var{function}] [-C @var{command}] [-X @var{filterpat}]
[-P @var{prefix}] [-S @var{suffix}] @var{name} [@var{name} @dots{}]} [-P @var{prefix}] [-S @var{suffix}] @var{name} [@var{name} @dots{}]}
@code{complete -pr [-E] [@var{name} @dots{}]} @code{complete -pr [-DE] [@var{name} @dots{}]}
@end example @end example
Specify how arguments to each @var{name} should be completed. Specify how arguments to each @var{name} should be completed.
@ -1729,12 +1797,16 @@ reused as input.
The @option{-r} option removes a completion specification for The @option{-r} option removes a completion specification for
each @var{name}, or, if no @var{name}s are supplied, all each @var{name}, or, if no @var{name}s are supplied, all
completion specifications. completion specifications.
The @option{-D} option indicates that the remaining options and actions should
apply to the ``default'' command completion; that is, completion attempted
on a command for which no completion has previously been defined.
The @option{-E} option indicates that the remaining options and actions should The @option{-E} option indicates that the remaining options and actions should
apply to ``empty'' command completion; that is, completion attempted on a apply to ``empty'' command completion; that is, completion attempted on a
blank line. blank line.
The process of applying these completion specifications when word completion The process of applying these completion specifications when word completion
is attempted is described above (@pxref{Programmable Completion}). is attempted is described above (@pxref{Programmable Completion}). The
@option{-D} option takes precedence over @option{-E}.
Other options, if specified, have the following meanings. Other options, if specified, have the following meanings.
The arguments to the @option{-G}, @option{-W}, and @option{-X} options The arguments to the @option{-G}, @option{-W}, and @option{-X} options
@ -1908,7 +1980,7 @@ an error occurs adding a completion specification.
@item compopt @item compopt
@btindex compopt @btindex compopt
@example @example
@code{compopt} [-o @var{option}] [+o @var{option}] [@var{name}] @code{compopt} [-o @var{option}] [-DE] [+o @var{option}] [@var{name}]
@end example @end example
Modify completion options for each @var{name} according to the Modify completion options for each @var{name} according to the
@var{option}s, or for the currently-execution completion if no @var{name}s @var{option}s, or for the currently-execution completion if no @var{name}s
@ -1917,6 +1989,14 @@ If no @var{option}s are given, display the completion options for each
@var{name} or the current completion. @var{name} or the current completion.
The possible values of @var{option} are those valid for the @code{complete} The possible values of @var{option} are those valid for the @code{complete}
builtin described above. builtin described above.
The @option{-D} option indicates that the remaining options should
apply to the ``default'' command completion; that is, completion attempted
on a command for which no completion has previously been defined.
The @option{-E} option indicates that the remaining options should
apply to ``empty'' command completion; that is, completion attempted on a
blank line.
The @option{-D} option takes precedence over @option{-E}.
The return value is true unless an invalid option is supplied, an attempt The return value is true unless an invalid option is supplied, an attempt
is made to modify the options for a @var{name} for which no completion is made to modify the options for a @var{name} for which no completion

View File

@ -20,7 +20,7 @@ are preserved on all copies.
@quotation @quotation
Permission is granted to copy, distribute and/or modify this document Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 or under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no any later version published by the Free Software Foundation; with no
Invariant Sections, with the Front-Cover texts being ``A GNU Manual'', 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 and with the Back-Cover Texts as in (a) below. A copy of the license is

View File

@ -2,9 +2,9 @@
Copyright (C) 1988-2009 Free Software Foundation, Inc. Copyright (C) 1988-2009 Free Software Foundation, Inc.
@end ignore @end ignore
@set EDITION 6.0 @set EDITION 6.1
@set VERSION 6.0 @set VERSION 6.1
@set UPDATED 28 October 2008 @set UPDATED 9 October 2009
@set UPDATED-MONTH October 2008 @set UPDATED-MONTH October 2009
@set LASTCHANGE Tue Oct 28 11:25:24 EDT 2008 @set LASTCHANGE Fri Oct 9 12:57:58 EDT 2009

View File

@ -105,11 +105,13 @@ static const FUNMAP default_funmap[] = {
{ "kill-region", rl_kill_region }, { "kill-region", rl_kill_region },
{ "kill-word", rl_kill_word }, { "kill-word", rl_kill_word },
{ "menu-complete", rl_menu_complete }, { "menu-complete", rl_menu_complete },
{ "menu-complete-backward", rl_backward_menu_complete },
{ "next-history", rl_get_next_history }, { "next-history", rl_get_next_history },
{ "non-incremental-forward-search-history", rl_noninc_forward_search }, { "non-incremental-forward-search-history", rl_noninc_forward_search },
{ "non-incremental-reverse-search-history", rl_noninc_reverse_search }, { "non-incremental-reverse-search-history", rl_noninc_reverse_search },
{ "non-incremental-forward-search-history-again", rl_noninc_forward_search_again }, { "non-incremental-forward-search-history-again", rl_noninc_forward_search_again },
{ "non-incremental-reverse-search-history-again", rl_noninc_reverse_search_again }, { "non-incremental-reverse-search-history-again", rl_noninc_reverse_search_again },
{ "old-menu-complete", rl_old_menu_complete },
{ "overwrite-mode", rl_overwrite_mode }, { "overwrite-mode", rl_overwrite_mode },
#ifdef __CYGWIN__ #ifdef __CYGWIN__
{ "paste-from-clipboard", rl_paste_from_clipboard }, { "paste-from-clipboard", rl_paste_from_clipboard },
@ -123,6 +125,7 @@ static const FUNMAP default_funmap[] = {
{ "revert-line", rl_revert_line }, { "revert-line", rl_revert_line },
{ "self-insert", rl_insert }, { "self-insert", rl_insert },
{ "set-mark", rl_set_mark }, { "set-mark", rl_set_mark },
{ "skip-csi-sequence", rl_skip_csi_sequence },
{ "start-kbd-macro", rl_start_kbd_macro }, { "start-kbd-macro", rl_start_kbd_macro },
{ "tab-insert", rl_tab_insert }, { "tab-insert", rl_tab_insert },
{ "tilde-expand", rl_tilde_expand }, { "tilde-expand", rl_tilde_expand },

View File

@ -305,16 +305,20 @@ get_history_event (string, caller_index, delimiting_quote)
/* Extract the contents of STRING as if it is enclosed in single quotes. /* Extract the contents of STRING as if it is enclosed in single quotes.
SINDEX, when passed in, is the offset of the character immediately SINDEX, when passed in, is the offset of the character immediately
following the opening single quote; on exit, SINDEX is left pointing following the opening single quote; on exit, SINDEX is left pointing
to the closing single quote. */ to the closing single quote. FLAGS currently used to allow backslash
to escape a single quote (e.g., for bash $'...'). */
static void static void
hist_string_extract_single_quoted (string, sindex) hist_string_extract_single_quoted (string, sindex, flags)
char *string; char *string;
int *sindex; int *sindex, flags;
{ {
register int i; register int i;
for (i = *sindex; string[i] && string[i] != '\''; i++) for (i = *sindex; string[i] && string[i] != '\''; i++)
; {
if ((flags & 1) && string[i] == '\\' && string[i+1])
i++;
}
*sindex = i; *sindex = i;
} }
@ -924,7 +928,7 @@ history_expand (hstring, output)
char **output; char **output;
{ {
register int j; register int j;
int i, r, l, passc, cc, modified, eindex, only_printing, dquote; int i, r, l, passc, cc, modified, eindex, only_printing, dquote, flag;
char *string; char *string;
/* The output string, and its length. */ /* The output string, and its length. */
@ -1044,8 +1048,9 @@ history_expand (hstring, output)
else if (dquote == 0 && history_quotes_inhibit_expansion && string[i] == '\'') else if (dquote == 0 && history_quotes_inhibit_expansion && string[i] == '\'')
{ {
/* If this is bash, single quotes inhibit history expansion. */ /* If this is bash, single quotes inhibit history expansion. */
flag = (i > 0 && string[i - 1] == '$');
i++; i++;
hist_string_extract_single_quoted (string, &i); hist_string_extract_single_quoted (string, &i, flag);
} }
else if (history_quotes_inhibit_expansion && string[i] == '\\') else if (history_quotes_inhibit_expansion && string[i] == '\\')
{ {
@ -1096,7 +1101,7 @@ history_expand (hstring, output)
if (strlen (mb) > 1) if (strlen (mb) > 1)
{ {
ADD_STRING (mb); ADD_STRING (mb);
break; continue;
} }
} }
#endif /* HANDLE_MULTIBYTE */ #endif /* HANDLE_MULTIBYTE */
@ -1130,8 +1135,9 @@ history_expand (hstring, output)
{ {
int quote, slen; int quote, slen;
flag = (i > 0 && string[i - 1] == '$');
quote = i++; quote = i++;
hist_string_extract_single_quoted (string, &i); hist_string_extract_single_quoted (string, &i, flag);
slen = i - quote + 2; slen = i - quote + 2;
temp = (char *)xmalloc (slen); temp = (char *)xmalloc (slen);
@ -1435,17 +1441,21 @@ history_tokenize_word (string, ind)
i += 2; i += 2;
return i; return i;
} }
else else if ((peek == '&' && (string[i] == '>' || string[i] == '<')) ||
(peek == '>' && string[i] == '&') ||
(peek == '(' && (string[i] == '>' || string[i] == '<')) || /* ) */
(peek == '(' && string[i] == '$')) /* ) */
{ {
if ((peek == '&' && (string[i] == '>' || string[i] == '<')) || i += 2;
(peek == '>' && string[i] == '&') || return i;
(peek == '(' && (string[i] == '>' || string[i] == '<')) || /* ) */
(peek == '(' && string[i] == '$')) /* ) */
{
i += 2;
return i;
}
} }
#if 0
else if (peek == '\'' && string[i] == '$')
{
i += 2; /* XXX */
return i;
}
#endif
if (string[i] != '$') if (string[i] != '$')
{ {

View File

@ -45,14 +45,7 @@
# include "ansi_stdlib.h" # include "ansi_stdlib.h"
#endif /* HAVE_STDLIB_H */ #endif /* HAVE_STDLIB_H */
#if defined (HAVE_SELECT) #include "posixselect.h"
# if !defined (HAVE_SYS_SELECT_H) || !defined (M_UNIX)
# include <sys/time.h>
# endif
#endif /* HAVE_SELECT */
#if defined (HAVE_SYS_SELECT_H)
# include <sys/select.h>
#endif
#if defined (FIONREAD_IN_SYS_IOCTL) #if defined (FIONREAD_IN_SYS_IOCTL)
# include <sys/ioctl.h> # include <sys/ioctl.h>
@ -190,8 +183,7 @@ rl_gather_tyi ()
FD_ZERO (&exceptfds); FD_ZERO (&exceptfds);
FD_SET (tty, &readfds); FD_SET (tty, &readfds);
FD_SET (tty, &exceptfds); FD_SET (tty, &exceptfds);
timeout.tv_sec = 0; USEC_TO_TIMEVAL (_keyboard_input_timeout, timeout);
timeout.tv_usec = _keyboard_input_timeout;
result = select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout); result = select (tty + 1, &readfds, (fd_set *)NULL, &exceptfds, &timeout);
if (result <= 0) if (result <= 0)
return 0; /* Nothing to read. */ return 0; /* Nothing to read. */

View File

@ -57,8 +57,9 @@ Keymap
rl_make_bare_keymap () rl_make_bare_keymap ()
{ {
register int i; register int i;
Keymap keymap = (Keymap)xmalloc (KEYMAP_SIZE * sizeof (KEYMAP_ENTRY)); Keymap keymap;
keymap = (Keymap)xmalloc (KEYMAP_SIZE * sizeof (KEYMAP_ENTRY));
for (i = 0; i < KEYMAP_SIZE; i++) for (i = 0; i < KEYMAP_SIZE; i++)
{ {
keymap[i].type = ISFUNC; keymap[i].type = ISFUNC;
@ -76,7 +77,8 @@ rl_make_bare_keymap ()
return (keymap); return (keymap);
} }
/* Return a new keymap which is a copy of MAP. */ /* Return a new keymap which is a copy of MAP. Just copies pointers, does
not copy text of macros or descend into child keymaps. */
Keymap Keymap
rl_copy_keymap (map) rl_copy_keymap (map)
Keymap map; Keymap map;
@ -128,7 +130,7 @@ rl_discard_keymap (map)
{ {
int i; int i;
if (!map) if (map == 0)
return; return;
for (i = 0; i < KEYMAP_SIZE; i++) for (i = 0; i < KEYMAP_SIZE; i++)
@ -140,6 +142,7 @@ rl_discard_keymap (map)
case ISKMAP: case ISKMAP:
rl_discard_keymap ((Keymap)map[i].function); rl_discard_keymap ((Keymap)map[i].function);
free ((char *)map[i].function);
break; break;
case ISMACR: case ISMACR:
@ -148,3 +151,12 @@ rl_discard_keymap (map)
} }
} }
} }
/* Convenience function that discards, then frees, MAP. */
void
rl_free_keymap (map)
Keymap map;
{
rl_discard_keymap (map);
free ((char *)map);
}

View File

@ -77,7 +77,7 @@ _rl_find_next_mbchar_internal (string, seed, count, find_non_zero)
char *string; char *string;
int seed, count, find_non_zero; int seed, count, find_non_zero;
{ {
size_t tmp; size_t tmp, len;
mbstate_t ps; mbstate_t ps;
int point; int point;
wchar_t wc; wchar_t wc;
@ -99,7 +99,10 @@ _rl_find_next_mbchar_internal (string, seed, count, find_non_zero)
while (count > 0) while (count > 0)
{ {
tmp = mbrtowc (&wc, string+point, strlen(string + point), &ps); len = strlen (string + point);
if (len == 0)
break;
tmp = mbrtowc (&wc, string+point, len, &ps);
if (MB_INVALIDCH ((size_t)tmp)) if (MB_INVALIDCH ((size_t)tmp))
{ {
/* invalid bytes. assume a byte represents a character */ /* invalid bytes. assume a byte represents a character */

View File

@ -38,16 +38,7 @@
# include <unistd.h> # include <unistd.h>
#endif #endif
#if defined (FD_SET) && !defined (HAVE_SELECT) #include "posixselect.h"
# define HAVE_SELECT
#endif
#if defined (HAVE_SELECT)
# include <sys/time.h>
#endif /* HAVE_SELECT */
#if defined (HAVE_SYS_SELECT_H)
# include <sys/select.h>
#endif
#if defined (HAVE_STRING_H) #if defined (HAVE_STRING_H)
# include <string.h> # include <string.h>
@ -130,8 +121,7 @@ rl_insert_close (count, invoking_key)
FD_ZERO (&readfds); FD_ZERO (&readfds);
FD_SET (fileno (rl_instream), &readfds); FD_SET (fileno (rl_instream), &readfds);
timer.tv_sec = 0; USEC_TO_TIMEVAL (_paren_blink_usec, timer);
timer.tv_usec = _paren_blink_usec;
orig_point = rl_point; orig_point = rl_point;
rl_point = match_point; rl_point = match_point;

View File

@ -275,6 +275,10 @@ int _rl_bind_stty_chars = 1;
its initial state. */ its initial state. */
int _rl_revert_all_at_newline = 0; int _rl_revert_all_at_newline = 0;
/* Non-zero means to honor the termios ECHOCTL bit and echo control
characters corresponding to keyboard-generated signals. */
int _rl_echo_control_chars = 1;
/* **************************************************************** */ /* **************************************************************** */
/* */ /* */
/* Top Level Functions */ /* Top Level Functions */
@ -686,7 +690,8 @@ _rl_dispatch_callback (cxt)
r = cxt->childval; r = cxt->childval;
/* For now */ /* For now */
r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ)); if (r != -3) /* don't do this if we indicate there will be other matches */
r = _rl_subseq_result (r, cxt->oldmap, cxt->okey, (cxt->flags & KSEQ_SUBSEQ));
RL_CHECK_SIGNALS (); RL_CHECK_SIGNALS ();
if (r == 0) /* success! */ if (r == 0) /* success! */
@ -831,7 +836,7 @@ _rl_dispatch_subseq (key, map, got_subseq)
{ {
/* Return 0 only the first time, to indicate success to /* Return 0 only the first time, to indicate success to
_rl_callback_read_char. The rest of the time, we're called _rl_callback_read_char. The rest of the time, we're called
from _rl_dispatch_callback, so we return 3 to indicate from _rl_dispatch_callback, so we return -3 to indicate
special handling is necessary. */ special handling is necessary. */
r = RL_ISSTATE (RL_STATE_MULTIKEY) ? -3 : 0; r = RL_ISSTATE (RL_STATE_MULTIKEY) ? -3 : 0;
cxt = _rl_keyseq_cxt_alloc (); cxt = _rl_keyseq_cxt_alloc ();
@ -895,7 +900,7 @@ _rl_subseq_result (r, map, key, got_subseq)
Keymap m; Keymap m;
int type, nt; int type, nt;
rl_command_func_t *func, *nf; rl_command_func_t *func, *nf;
if (r == -2) if (r == -2)
/* We didn't match anything, and the keymap we're indexed into /* We didn't match anything, and the keymap we're indexed into
shadowed a function previously bound to that prefix. Call shadowed a function previously bound to that prefix. Call
@ -1169,6 +1174,10 @@ bind_arrow_keys ()
#if defined (VI_MODE) #if defined (VI_MODE)
bind_arrow_keys_internal (vi_movement_keymap); bind_arrow_keys_internal (vi_movement_keymap);
/* Unbind vi_movement_keymap[ESC] to allow users to repeatedly hit ESC
in vi command mode while still allowing the arrow keys to work. */
if (vi_movement_keymap[ESC].type == ISKMAP)
rl_bind_keyseq_in_map ("\033", (rl_command_func_t *)NULL, vi_movement_keymap);
bind_arrow_keys_internal (vi_insertion_keymap); bind_arrow_keys_internal (vi_insertion_keymap);
#endif #endif
} }

View File

@ -95,6 +95,7 @@ extern int rl_forward_word PARAMS((int, int));
extern int rl_backward_word PARAMS((int, int)); extern int rl_backward_word PARAMS((int, int));
extern int rl_refresh_line PARAMS((int, int)); extern int rl_refresh_line PARAMS((int, int));
extern int rl_clear_screen PARAMS((int, int)); extern int rl_clear_screen PARAMS((int, int));
extern int rl_skip_csi_sequence PARAMS((int, int));
extern int rl_arrow_keys PARAMS((int, int)); extern int rl_arrow_keys PARAMS((int, int));
/* Bindable commands for inserting and deleting text. */ /* Bindable commands for inserting and deleting text. */
@ -150,7 +151,9 @@ extern int rl_dump_variables PARAMS((int, int));
extern int rl_complete PARAMS((int, int)); extern int rl_complete PARAMS((int, int));
extern int rl_possible_completions PARAMS((int, int)); extern int rl_possible_completions PARAMS((int, int));
extern int rl_insert_completions PARAMS((int, int)); extern int rl_insert_completions PARAMS((int, int));
extern int rl_old_menu_complete PARAMS((int, int));
extern int rl_menu_complete PARAMS((int, int)); extern int rl_menu_complete PARAMS((int, int));
extern int rl_backward_menu_complete PARAMS((int, int));
/* Bindable commands for killing and yanking text, and managing the kill ring. */ /* Bindable commands for killing and yanking text, and managing the kill ring. */
extern int rl_kill_word PARAMS((int, int)); extern int rl_kill_word PARAMS((int, int));
@ -675,6 +678,17 @@ extern rl_icppfunc_t *rl_directory_completion_hook;
yet, so it's undocumented. */ yet, so it's undocumented. */
extern rl_icppfunc_t *rl_directory_rewrite_hook; extern rl_icppfunc_t *rl_directory_rewrite_hook;
/* If non-zero, this is the address of a function to call when reading
directory entries from the filesystem for completion and comparing
them to the partial word to be completed. The function should
either return its first argument (if no conversion takes place) or
newly-allocated memory. This can, for instance, convert filenames
between character sets for comparison against what's typed at the
keyboard. The returned value is what is added to the list of
matches. The second argument is the length of the filename to be
converted. */
extern rl_dequote_func_t *rl_filename_rewrite_hook;
/* Backwards compatibility with previous versions of readline. */ /* Backwards compatibility with previous versions of readline. */
#define rl_symbolic_link_hook rl_directory_completion_hook #define rl_symbolic_link_hook rl_directory_completion_hook

Some files were not shown because too many files have changed in this diff Show More