This is a list of changes that have been made since the 02/21/85 version
of ksh.  A number enhancements have been made.  The rest are bug fixes.
Many changes of the code have been made to enhance portability with certain
compile options driven by the characteristics of the target system.

1.	Ksh now accepts eight bit character sets transparently.  Previous
	versions used the eighth bit internally to keep track of quoting.

2.	The expansion for "$*" now uses the first character of the IFS parameter
	as a separator rather than a space.  If IFS is unset or null then no
	separator is used.  "$@" now expands correctly to "$1" "$2" ...,
	when used as a command argument, no matter what value IFS has.
	"${@}" and "${array[@]}" now correctly expand to no an implicit null
	when {#@} and ${#array[@]} are zero.

3.	The protected mode, -p has been added to 'set' and to the shell invocation
	line.  This sets the PATH variable to the default, disables the .profile,
	and uses the file /etc/suid_profile instead of the ENV file.  This mode is
	set automatically for setuid,setgid scripts.  The default path has been
	changed to /bin:/usr/bin:.  A restricted shell now disables setting the
	ENV parameter.

4.	The shell can now execute scripts which do not have read permission
	and scripts which have the setuid and/or setgid set when they are
	invoked by name rather than as an argument to the shell.  For this
	feature to work, a program supplied with ksh named suid_exec must
	be installed as a suid root program in /etc and ksh must be
	installed in the /bin directory.

5.	The history file has a slightly changed format.  Old style ksh
	history files are recognized and read correctly.  It allows eight
	bit characters in commands and supports essentially unlimited size
	histories.

6.	The HISTSIZE parameter now controls how many commands from the last
	login session are saved.  Previously, the last 4K bytes of the history
	file was saved across logins but since the history file stores the
	text of functions, the number of saved commands varied.

7.	The shell now accepts decimal values as numerical constants when
	performing arithmetic evaluation and truncated them.  Thus let x=2.2
	yields x=2 rather than producing an error message.

8.	Options settings, set, are now atomic, i.e., they all take effect or
	none take effect.  Previously, set -emacs caused the shell to abort
	since -e set the error on exit, and the c option cause the set
	command to terminate with an error.  Now this will just produce
	an error.

9.	The commands echo and pwd are built into ksh.  Previously, they
	were aliases.  On BSD Unix echo will behave like "print -R" if
	echo would "whence" to /bin/echo if it were not a built-in. The
	PWD variable is no longer readonly but will be reset by cd.

10.	The -a option has been added to ulimit for BSD.  This option can
	be used to list all current resource limits.

11.	Process substitution, the ability to pass named pipes as command
	arguments, has been documented even though it still does not work
	on all UNIX systems since it requires the /dev/fd directory.

12.	The shell now uses the LINES parameter to control printing of
	select lists.  When possible, select tries to use about two-thirds
	of the number of LINES.  kill -l now uses select list format with
	numbers representing the signal number.

13.	There have been a number of additions and changes to the emacs edit
	mode.  The command M-C has been change to M-c and the command M-l
	has been added to convert to lower case.  Several of the M- commands
	not allow numeric parameters.  M-= has been added to list the files
	matching the current word.  In the BSD version, the character ^Y
	can now be used as an editing character.

14.	Errors on some built-ins now cause a shell script which contains
	them to abort.  The details as to which ones are in the manual page.

15.	A shell variable SECONDS has been added which is incremented every
	second.  Initially it is set to zero but you can assign to it to
	reset it.  It is an integer variable.

16.	The shell now prints the line number on error messages.  This should
	aid debugging scripts.

17.	The execution trace flag, -x, is no longer remains on when executing
	shell functions.  Instead, any function which has the -t attribute
	turned on (typeset -ft <name>), will cause the trace flag to be turned
	on for the function <name>.

18.	You can now do expansions for multi-digit positional parameters.
	However, you must include the number in braces.  Thus, ${11} gives
	the eleventh positional parameter and eval '$'{$#} gives the last.

19.	The code has been reorganized somewhat and generates far fewer lint
	warnings.  There is more automatic feature configuration and there
	is a 4th generation makefile included for those who have fourth
	generation make available.  A VFORK compile option is available
	which causes the shell to use vfork() instead of fork() whenever
	possible.  This is now the default mode for apollo UNIX.  The shell
	no longer uses the segmentation violation faults internally so there
	should be fewer "no space" messages.

20.	The y and Y commands have been added to the vi-edit mode. A new command
	= has been added which prints a select list of files matching the
	current word. The @ command has been added to allow macro definitions.
	Some modifications have been made to speed up screen updates at
	slower baud rates.

21.	When the shell is invoked as sh prog a path search is now performed
	on prog.

22.	There is a new command substitution syntax $(command).  The old ``
	syntax is still supported and is completely compatible with the SVR2
	shell.  The new syntax allows anything within () without quoting
	since this quoting nests.  Thus, "$(" $()")" is legal and performs
	a nested command substitution.  Any old script which has a $(
	within "" must prepend a \ in front of the $ to make it work for
	ksh.  The script will continue to run under the SVR2 shell.

23.	The variable _ is set to the file name of the command exec'd in
	the environment. Thus, any program can find its binary file whenever
	it is invoked by the shell.

24.	Bugs fixed in all versions.
	a.	An insidious bug which, on rare occasions, caused cd to fail
		without any indication has been fixed.  This bug only
		occurred with certain environments.  Its only reports happened
		in conjunction with a recursive make procedure.

	b.	A shell invoked as sh -c 'program <<!
		anything
		! '
		no longer gives a 'cannot open' on a temporary file.

	c.	The whence command didn't work correctly when there was
		a command in the current directory with the name of a
		tracked alias and  the current directory came before the
		path of the tracked alias in the path.

	d.	The first argument of a for list was not always processed
		correctly.  For example, x='*';for i in "$x";do ...;done
		did not correctly expand $x.

	e.	If a / was quoted, then file name generation did not
		take place in some instances, for example 'dir/'* did
		not expand.  It does this correctly now.

	f.	The trackall option was inadvertently getting turned on
		by default.  The default should be off in the interactive
		mode

	g.	The pattern */dir did not expand if * matched a directory
		which was searchable but not readable.  As long as dir
		doesn't contain any special pattern characters, read
		permission is not needed for any directory matching */

	h.	If an alias x='name=value command' was defined, then
		name2=value2 x did not work correctly.

	i.	Shift and . no longer leave side effects when used with
		command substitution.

	j.	The typeset command invoked with certain invalid options
		will no longer cause the shell to dump core.

	k.	If a script contains two calls to a function with both file
		descriptor zero and one redirected, then file descriptor 1 now
		gets restored after the second function call.

	l.	Signal table names are taken from /usr/include/sys/signal.h at
		compile time so systems that use non-standard signal numbers 
		should work OK with ksh.  You can now set traps on signal 11
		since the shell no longer uses this signal internally for
		its own stack management.

	m.	A cd to a relative directory in the /etc/profile or .profile
		before the PWD variable was set caused you to wind up in the
		wrong directory.  This has been fixed.

	n.	The ignoreeof option now ignores eof from the secondary prompt.

	o.	A shell invoked as sh -c "
		command1
		command2
		"
		no longer exits after command1 completes.

	p.	An r of an incomplete compound command no longer causes the
		shell to die after the unexpected eof message.

	q.	Assignments of negative numbers with let no longer result it
		large positive numbers.  let x=-3;echo $x now yields -3.

	r.	Interactive shells now work correctly the standard input is
		a pipeline.  Previously interactive shells tried to buffer
		standard input.

	s.	In vi mode the line you are currently typing is not lost
		if you move back in the history list.  Also, operations with
		the last word of a line when it ended in a non-alphanumeric
		character now works correctly.

	t.	The PPID variable now works correctly no matter how a script
		in invoked.

	u.	r old=new commands now print out the command before it does
		the execution.

	v.	If a local variable within a function is exported, then
		the local value gets passed.  Previously, the original
		value of the value got passed in the environment.

	w.	exec ksh <<!
		!
		no longer causes a /tmp file to be left behind.

	x.	A bug which sometimes gave a "no space" message when the
		"read" command was redirected or in a loop that was
		re-directed has been fixed.

	y.	The jobs number and process id message for background jobs
		sometimes went to the standard output channel.  They now
		always go to stderr.

	z.	The jobs command can now be used in a pipeline.

	aa.	2>&1 cmd >file is now equivalent to cmd 2>&1 >file.  In the
		Bourne shell  and in earlier versions of ksh, the order of
		redirection was reversed in the first form.

	bb.	Open file descriptors for units above two no longer get
		closed on exec for compound commands.  Thus, the command
		{ command1;command2;} 7> file will no leave unit 7 open for
		command1 and command2.

	cc.	A bug in printing the ulimit on 16-bit machines has been fixed.

	dd.	The command substitution `< file*` now expands when there
		is exactly one matching file.

	ee.	The shell now checks for running out of open file descriptors
		internally and prints out a message.

	ff.	The ulimit -p now gives the correct error on systems that
		don't support this option.

	gg.	Unsetting the highest element of an array, no longer causes
		${array[*]} from producing a bad subscript error.
