mirror of
https://https.git.savannah.gnu.org/git/bash.git
synced 2026-06-30 17:09:50 +02:00
585 lines
19 KiB
Plaintext
585 lines
19 KiB
Plaintext
|
|
This documents the changes between the first `public' release of CWRU bash
|
|
and this, its second release. It summarizes, without going into detail,
|
|
the changes that have been made.
|
|
|
|
NEW FEATURES
|
|
|
|
o `getopts' builtin, as specified by Posix.2
|
|
|
|
o new configuration variable HAVE_UNISTD_H, used to include
|
|
<unistd.h> and test for Posix features
|
|
|
|
o `ulimit' has new -p and -n options to report the pipe buffer size
|
|
and number of available file descriptors, respectively
|
|
|
|
o allow SIGCHLD to be trapped and useful behavior to result if it is
|
|
|
|
o Posix termios and signal code for readline and the shell itself
|
|
|
|
o can optionally use the GNU termcap library
|
|
|
|
o new output for `times' builtin that looks like ksh:
|
|
|
|
shell-user shell-sys
|
|
child-user child-sys
|
|
|
|
o `ulimit' limits now apply to both shell and its children
|
|
|
|
o new machines.h entries
|
|
|
|
o no longer does the costly `close file descriptors 3-NOFILE'
|
|
each time it exec's a program -- now uses the close-on-exec
|
|
flag for the files it fiddles with
|
|
|
|
NOTABLE BUG FIXES
|
|
|
|
o jobs.c only sets and gets the tty state in an interactive shell
|
|
|
|
o bash does better process group checking on Posix systems, eliminating
|
|
some error messages
|
|
|
|
o fix for `infinite login' bug on System V machines when executing a
|
|
script from a .bash_profile
|
|
|
|
o the `trap' command now behaves as 1003.2 specifies, as of draft 9
|
|
|
|
o restore original terminal process group upon exit, so as to not
|
|
confuse a parent Bourne shell
|
|
|
|
o `bash file', where `file' is a binary file, now reports an error
|
|
|
|
o shells started with `-s' now execute the .bashrc file
|
|
|
|
|
|
CHANGES (by date and files affected)
|
|
9/20 - 9/30
|
|
-----------
|
|
|
|
builtins.c, builtins.c.posix
|
|
- added getopts help text
|
|
- removed extra "let" from `let' error message
|
|
- added correct extern definition for list_rest_of_args() to shift
|
|
builtin
|
|
|
|
jobs.c, jobs.c.posix
|
|
- removed bogus call to set_process_resource_limits() from
|
|
make_child() as a consequence of redoing `ulimit'
|
|
- initialize shell_tty to -1
|
|
- only get or set the tty state after a command completes if the shell
|
|
is interactive
|
|
- use shell_tty in get_tty_state() and set_tty_state() instead of
|
|
reopening /dev/tty every time
|
|
|
|
jobs.c.posix
|
|
- do better pgrp checking in initialize_jobs() to avoid error message
|
|
about not being able to setpgid(2) on startup
|
|
- changed tcsetattr() error messages slightly
|
|
|
|
expr.c
|
|
- avoid advancing beyond the end of the expression when reporting an
|
|
error
|
|
- NULL expressions now return 0 ($[], for example)
|
|
|
|
mailcheck.c
|
|
- #ifdef redundant definition of NOW, which is also defined in
|
|
general.h
|
|
|
|
variables.c
|
|
- initialize $OPTIND and $OPTERR to 1 for getopts
|
|
- add correct extern definition for itos()
|
|
|
|
subst.c
|
|
- if $IFS is unset, it defaults to " \t\n"
|
|
- add special variable hack functions for $OPTIND, $OPTERR
|
|
|
|
builtins.h
|
|
- add definition for getopts_builtin()
|
|
|
|
getopts.c
|
|
- new file, source for `getopts' builtin command
|
|
|
|
ulimit.c
|
|
- remove the `struct ResourceLimit' stuff; limits now apply to both
|
|
the shell and its children
|
|
- took out set_process_resource_limits(), let ulimit(2) or
|
|
setrlimit(2) do the work
|
|
- changed error messages to use builtin_error() instead of
|
|
report_error()
|
|
- changed the block factor for RLIMIT_CPU from 1000 (milliseconds)
|
|
to 1 (seconds)
|
|
|
|
|
|
10/1
|
|
----
|
|
|
|
builtins.c, builtins.c.posix
|
|
- changed `test' help text for -ef option
|
|
- made `trap -' reset all signals to their original values
|
|
|
|
machines.h
|
|
- added a new configuration variable, HAVE_UNISTD_H, which should
|
|
be defined if /usr/include/unistd.h exists
|
|
|
|
cpp-Makefile
|
|
- make HAVE_UNISTD_H show though from machines.h to the bash code
|
|
- add an explicit build line for ulimit.o so `psize.sh' is run
|
|
each time ulimit.o is remade. This is kind of flaky.
|
|
config.h
|
|
- include <unistd.h> if HAVE_UNISTD_H is defined, use it to test
|
|
for various Posix features (job control, signals, termios)
|
|
|
|
jobs.c, jobs.c.posix
|
|
- restore original signals to child process in make_child()
|
|
- keep count of number of children that exit or stop in flush_child(),
|
|
and call a trap handler for SIGCHLD that many times. This allows
|
|
SIGCHLD to be trapped without disaster occurring.
|
|
|
|
shell.c
|
|
- If we're on a Posix system, initialize signals the Posix way
|
|
- clear signal mask in initialize_signals() if on Posix system
|
|
- set login_shell and make_login_shell to 0 upon entry to main(),
|
|
solving the System V infinite login bug
|
|
|
|
trap.c
|
|
- preserve value of $? when running traps
|
|
- don't allow a signal ignored upon entry to the shell to be trapped
|
|
or reset to the default
|
|
- do not allow trapping SIGCHLD to change the signal handler, but
|
|
save the commands to be executed. Run these commands from the
|
|
SIGCHLD signal handler for each child that exits or stops
|
|
- don't allow SIGCHLD signal handler to be overridden or have SIGCHLD
|
|
ignored
|
|
- new function added to restore all trapped signals to their original
|
|
values
|
|
|
|
ulimit.c
|
|
- add new -p option to report pipe buffer size. This is flaky on
|
|
all non-Posix systems (those that do not define PIPE_BUF).
|
|
|
|
readline/readline.c
|
|
- add Posix termios and signal code
|
|
|
|
10/2
|
|
----
|
|
|
|
jobs.c, jobs.c.posix
|
|
- only fetch terminal state in initialize_jobs() if the shell is
|
|
interactive
|
|
|
|
10/3
|
|
----
|
|
|
|
machines.h
|
|
- new entry for Stardent
|
|
- new variable USE_TERMCAP_EMULATION, for those systems that have the
|
|
termcap(3) functions in the curses library, but have not linked
|
|
/usr/lib/libtermcap.a to libcurses.a
|
|
|
|
cpp-Makefile
|
|
- use USE_TERMCAP_EMULATION to set TERMCAP and TERMLIB
|
|
|
|
siglist.c, alias.h, general.c
|
|
- declare the return values of xmalloc() and malloc() for the benefit
|
|
of machines which cannot cope with simply casting the return value
|
|
|
|
shell.c, execute_cmd.c
|
|
- change the re-execution of main() when executing a shell script to
|
|
use setjmp/longjmp
|
|
|
|
builtins.c
|
|
- add code to change the shell level in exec_builtin(), decrementing
|
|
it before trying the execve(2) and incrementing it again if that
|
|
fails
|
|
|
|
variables.c
|
|
- new function adjust_shell_level() to change shell level by a
|
|
specified increment
|
|
- initialize `noclobber' in shell_initialize(), if we have inherited
|
|
the `noclobber' variable from a parent shell
|
|
|
|
ulimit.c
|
|
- add new option -n, which reports the max number of available file
|
|
descriptors as reported by getdtablesize(). On SunOS 4.1, this
|
|
can be set, too, with setrlimit(RLIM_NOFILE, ...).
|
|
|
|
10/4
|
|
----
|
|
|
|
readline/readline.c
|
|
- Ultrix turns off system call restart when executing in `Posix mode'
|
|
(when sigaction(3) is used to set signal handling), so make it use
|
|
the System V version of shell_getc()
|
|
|
|
jobs.c.posix
|
|
- fix a bug in start_job() where `oset' was not initialized in the first
|
|
call to sigprocmask(), yet was used in subsequent calls
|
|
- remove the `shadow' instance of shell_tty_info in the code that sets
|
|
the line discipline in initialize_jobs()
|
|
|
|
shell.c
|
|
- if job control is being used, restore the tty pgrp to its original
|
|
value so as to not screw the parent
|
|
|
|
builtins.c, builtins.c.posix
|
|
- make the output of `times' look more like ksh
|
|
|
|
10/5
|
|
----
|
|
|
|
jobs.c.posix
|
|
- HP/UX no longer needs the signal handler for SIGCHLD reset via a
|
|
call to signal() in flush_child() -- this breaks job control
|
|
|
|
machines.h
|
|
- add HAVE_VPRINTF to HP/UX entry
|
|
|
|
siglist.c
|
|
- include <stdio.h>, sprintf(3) requires it on some systems
|
|
|
|
10/8
|
|
----
|
|
|
|
execute_cmd.c
|
|
- make $LINENO in a function count the number of simple commands
|
|
executed
|
|
|
|
10/9
|
|
----
|
|
|
|
termcap, cpp-Makefile
|
|
- new GNU termcap library, cribbed from Emacs. #define
|
|
USE_GNU_TERMCAP in machines.h entry to use it. Small changes
|
|
required to cpp-Makefile to make it work. This works on
|
|
4.3 BSD, at least.
|
|
|
|
machines.h
|
|
- add new entry for AIX/370
|
|
|
|
general.c
|
|
- sysv_getc() is also needed for Ultrix machines running in Posix
|
|
mode, so change the #ifdef accordingly (Ultrix passes the
|
|
SV_INTERRUPT flag to sigvec(2) in sigaction(3)).
|
|
|
|
subst.c
|
|
- use sysv_getc() for Ultrix machines running in Posix mode for
|
|
command subsitution pipe reading
|
|
|
|
10/10
|
|
-----
|
|
|
|
shell.c, execute_cmd.c
|
|
- if the `file' portion of `bash file' is a binary file, report an
|
|
error and do not attempt to execute it
|
|
|
|
jobs.c, jobs.c.posix
|
|
- the code that does the guts of `kill' now sends the SIGCONT to a
|
|
stopped job after it sends the specified signal, not before
|
|
|
|
10/11
|
|
-----
|
|
|
|
parse.y
|
|
- set +H also turned off putting commands into the history list
|
|
|
|
shell.c
|
|
- make shells started with -s read .bashrc
|
|
|
|
|
|
10/14
|
|
-----
|
|
|
|
expr.c
|
|
- changed calls to `report_error' to call `builtin_error'. I don't
|
|
know if this is exactly right, but it seems to me that an error
|
|
in an expression shouldn't kill the shell if -e is set.
|
|
|
|
fc.c
|
|
- changed `report_error' to `builtin_error'
|
|
|
|
10/16
|
|
-----
|
|
|
|
readline/vi_mode.c
|
|
- repeat count to rl_vi_subst() was incorrectly being ignored
|
|
- don't call rl_vi_change_case() on an empty line; two calls in
|
|
a row can cause a seg fault
|
|
|
|
|
|
10/17
|
|
-----
|
|
|
|
execute_cmd.c
|
|
- give builtins run in pipes a useful setting of top_level to
|
|
longjmp(2) to on errors
|
|
|
|
|
|
builtins.c, builtins.c.posix
|
|
- replace some occurrences of longjmp (top_level, ...) with simple
|
|
calls to return (EXECUTION_FAILURE)
|
|
|
|
10/18
|
|
-----
|
|
|
|
readline/readline.c
|
|
- Make O_NDELAY be the same as O_NONBLOCK on Posix systems
|
|
- Don't use IXANY if it's not defined (some strict Posix systems do
|
|
not define it)
|
|
- Posix systems need NOFLSH for c_lflag to avoid flushing the input
|
|
buffer after a SIGINT, SIGQUIT, or SIGSUSP. This is still wrong,
|
|
though.
|
|
|
|
execute_cmd.c, test.c, general.h
|
|
- use the Posix S_IS* macros to test file formats instead of explicitly
|
|
masking with S_IFMT and testing the result. Macros are provided
|
|
for those systems that do not have them (like 4.3 BSD).
|
|
|
|
parse.y
|
|
- fix expansion of \W in the prompt string so that it works when
|
|
you're in the root directory
|
|
|
|
machines.h
|
|
- add machine description for concurrent in UCB universe
|
|
|
|
Makefile
|
|
- make sure $(MFLAGS) is passed to the recursive make of bash-Makefile
|
|
|
|
10/22
|
|
-----
|
|
|
|
jobs.c.posix
|
|
- make sure the NOFLSH bit is turned on in the termios c_lflag word
|
|
so that typeahead doesn't get flushed on receipt of signals. THIS
|
|
HAS BEEN TAKEN OUT.
|
|
|
|
10/23
|
|
-----
|
|
|
|
execute_cmd.c
|
|
- change extract_colon_unit() to increment the path index past a
|
|
colon when it is called, before it tries to get the next component
|
|
from the path. Without doing this, `.' was always found as the
|
|
second component in the path, whether it was actually there or not.
|
|
|
|
trap.c, shell.c
|
|
- made SIGINT trap handling act the same as that of ksh and the BSD
|
|
sh. As a side effect (really the reason for doing this in the
|
|
first place), `read' is now interruptible.
|
|
|
|
Makefile
|
|
- made the CPPFLAGS definition useful by passing it to cpp when
|
|
making bash-Makefile from cpp-Makefile
|
|
- made the `echo' line when creating bash-Makefile really echo by
|
|
quoting the redirection to bash-Makefile
|
|
|
|
general.c
|
|
- make fcntl.h be included only if NO_DUP2 is defined
|
|
|
|
10/24
|
|
-----
|
|
cpp-Makefile
|
|
- make libreadline.a depend on the objects, not the sources. Without
|
|
this, you could delete on of the .o files to try to force a library
|
|
rebuild and have it not happen.
|
|
|
|
10/25
|
|
-----
|
|
|
|
shell.c
|
|
- make a flag of `-' signal the end of option arguments, like the
|
|
4.3 BSD sh, and in accordance with the Posix command line syntax
|
|
standard
|
|
|
|
shell.c, builtins.c, builtins.c.posix
|
|
- shuffle some code around so -o option can be given on the command
|
|
line -- there's no reason why it shouldn't be allowed.
|
|
|
|
variables.c, variables.h, execute_cmd.c, builtins.c, builtins.c.posix, shell.c,
|
|
subst.c, bashline.c, hash.h, variables.h
|
|
- change the implementation of shell function and variable storage to
|
|
a hash table instead of a singly-linked list
|
|
|
|
make_cmd.c, shell.c
|
|
- bug reports only get mailed out if MAIL_BUG_REPORTS is defined
|
|
|
|
10/29
|
|
-----
|
|
|
|
bashline.c
|
|
- some random cleanups from bfox
|
|
- make sure alias expansion is attempted in shell_expand_line () only
|
|
if ALIAS is defined
|
|
|
|
hash.c
|
|
- add default case to make_hash_table to force the number of buckets
|
|
in the table to be the default if 0 is passed as the number of
|
|
buckets
|
|
|
|
variables.c
|
|
- make initialize_shell_variables () call make_hash_table () with an
|
|
argument of 0 again (see previous entry).
|
|
|
|
|
|
variables.c, builtins.c, builtins.c.posix
|
|
- cleanups because map_over(), all_vars(), all_shell_variables(), and
|
|
all_shell_functions () can possibly return NULL lists, and such
|
|
lists should not be sorted or freed
|
|
|
|
trap.c
|
|
- make sure we declare `extern int last_command_exit_value' in
|
|
run_interrupt_trap ().
|
|
|
|
variables.c
|
|
- Don't override a HOSTTYPE variables that comes in from the
|
|
environment
|
|
|
|
10/30
|
|
-----
|
|
|
|
variables.c
|
|
- Fix a bug in variables.c: make_var_array () where it called
|
|
array_len on a NULL list
|
|
|
|
builtins.c, builtins.c.posix
|
|
- Add a description of `-m' to the help for the `set' builtin
|
|
command
|
|
|
|
11/1
|
|
----
|
|
|
|
general.c
|
|
- added a definition of bzero() for USG machines, because
|
|
there is a reference to it in the new variable hashing code
|
|
|
|
11/2
|
|
----
|
|
|
|
shell.c
|
|
- set forced_interactive to 0 in shell_reinitialize(), otherwise
|
|
shell scripts get marked as interactive
|
|
|
|
11/6
|
|
----
|
|
|
|
execute_cmd.c
|
|
- eliminated the costly loop from 3 to NOFILE closing all file
|
|
descriptors each time we exec a command by setting all file
|
|
descriptors > 2 opened as the result of a redirection and internal
|
|
to the shell to be close-on-exec, as well as all file descriptors
|
|
opened to save others in add_undo_redirect(). `internal to the
|
|
shell' means that the redirections were attached to shell builtin.
|
|
Other `internal' redirections include while, for, and until
|
|
loops, and shell functions. I got scared after reading that
|
|
s5r4 provides 2048 fd's per process -- 2045 (mostly useless)
|
|
close() calls on *each executed program*? No way, no how.
|
|
|
|
This caused the other fixes for this file to be discovered.
|
|
|
|
Unfortunately (there always seems to be a catch), 4.3 BSD up to
|
|
4.3-tahoe leaves a file descriptor open in setpwent() if you're
|
|
using dbm password files. 4.3+NFS does this if you're not using
|
|
YP. Arghhhhhhh... I haven't decided yet what to do about this;
|
|
probably just set fd 3 to close-on-exec when the shell is
|
|
initialized.
|
|
|
|
execute_cmd.c
|
|
- removed the call to `add_undo_redirect()' when a file is being
|
|
closed with the redirection operators [n]<&- and [n]>&-. The
|
|
effect was to make those operators useless. Sad to say, I was
|
|
probably the dummy who put it in there...
|
|
|
|
execute_cmd.c
|
|
- when calling fcntl(redirector, F_GETFD, 0) in do_redirection() to
|
|
find out if a file descriptor is active, do it only if redirector
|
|
is not the same as `fd', which you've just opened. This has
|
|
spectacularly bad consequences if you do something like
|
|
|
|
exec 3</dev/tty 4>/tmp/foo 5</dev/null
|
|
|
|
I'm probably to blame for this, too...
|
|
|
|
execute_cmd.c
|
|
- when saving a file descriptor in add_undo_redirect, make sure we
|
|
save the state of the close-on-exec flag, and restore it when
|
|
dup2'ing the saved fd back to the orignal.
|
|
|
|
execute_cmd.c
|
|
- when performing a redirection that causes us to open a file, make
|
|
sure we at least add an undo record to close the file, even if
|
|
the file descriptor is not already active
|
|
|
|
execute_cmd.c
|
|
- when duplicating a file descriptor as the result of a redirection
|
|
instruction, make sure to manually duplicate the state of the
|
|
close-on-exec flag
|
|
|
|
11/13
|
|
-----
|
|
|
|
execute_cmd.c
|
|
- finally tracked down and stamped out the persistant bug that caused
|
|
the shell to hang when doing a command like "history | more" when
|
|
there was more than a pipeful of text to send to `more' and you quit
|
|
out of `more'after the first screenful. An extra read end of the
|
|
pipe was being left open in the shell started to run `history', the
|
|
consequence being that that shell at the beginning of the pipeline
|
|
would never get the SIGPIPE that would cause it to exit. The fix
|
|
is kind of strange: pass around a file descriptor to close whenever
|
|
a child process is created in either execute_command_internal or
|
|
execute_simple_command. We just pass the file descriptor that we
|
|
want closed to the instance of execute_command_internal that runs
|
|
the first half of the pipeline, and it gets closed just like we
|
|
want.
|
|
|
|
In the future, this can (and probably should) be made into a bitmap
|
|
of file descriptors to close. It wouldn't have to be big, 16 should
|
|
be enough given the ability to do close-on-exec.
|
|
|
|
builtins.c, builtins.c.posix
|
|
- changed the one call to execute_command_internal to add the extra
|
|
parameter needed by the above fix.
|
|
|
|
unwind_prot.c
|
|
- make without_interrupts() block SIGINT on capable systems (Posix
|
|
and systems with BSD sigs) instead of ignoring it, which causes
|
|
interrupts to be dropped. Blocking is what you want, anyway.
|
|
|
|
execute_cmd.c
|
|
- add an unwind_protect for the redirections for a function or
|
|
builtin. To see why this is needed, define a function shcat:
|
|
|
|
shcat()
|
|
{
|
|
while read line
|
|
do
|
|
echo "$line"
|
|
done
|
|
}
|
|
|
|
Now execute "shcat < INSTALL" and try to interrupt it. Bash will
|
|
keep reading the lines from INSTALL and trying to execute them
|
|
until EOF, at which point the shell exits.
|
|
|
|
11/14
|
|
-----
|
|
|
|
execute_cmd.c
|
|
- a subshell spawned to execute a function or a builtin with a pipe
|
|
or an asynchronous function or builtin should have login_shell and
|
|
interactive set to 0. That way, if someone is stupid enough to
|
|
pipe to `exit' from a login shell, the subshell won't try to exec
|
|
.bash_logout.
|
|
|
|
11/16
|
|
-----
|
|
builtins.c, builtins.c.posix
|
|
- exit status of `type' was wrong for executable files, hashed and
|
|
unhashed
|
|
|
|
bashline.c
|
|
- Made bash_complete_filename_internal take just about everything
|
|
as a possible filename character. It still can't do completion
|
|
of a filename containing blanks if you type one of the blanks,
|
|
though -- it needs the blanks-as-word-separators logic to work
|
|
at all.
|