1da2e3ebdSchin
2*b30d1939SAndy Fiddaman		KSH-93 VS. KSH-88
3da2e3ebdSchin
4da2e3ebdSchin
5da2e3ebdSchinThe following is a list of known incompatibilities between ksh-93 and ksh-88.
6da2e3ebdSchinI have not include cases that are clearly bugs in ksh-88.  I also have
7da2e3ebdSchinomitted features that are completely upward compatible.
8da2e3ebdSchin
9da2e3ebdSchin1.	Functions, defined with name() with ksh-93 are compatible with
10da2e3ebdSchin	the POSIX standard, not with ksh-88.  No local variables are
11da2e3ebdSchin	permitted, and there is no separate scope.  Functions defined
12da2e3ebdSchin	with the function name syntax, maintain compatibility.
13da2e3ebdSchin	This also affects function traces.
14da2e3ebdSchin
15da2e3ebdSchin2.	! is now a reserved word.  As a result, any command by that
16da2e3ebdSchin	name will no longer work with ksh-93.
17da2e3ebdSchin
18da2e3ebdSchin3.	The -x attribute of alias and typeset -f is no longer
19da2e3ebdSchin	effective and the ENV file is only read for interactive
20da2e3ebdSchin	shells.  You need to use FPATH to make function definitions
21da2e3ebdSchin	visible to scripts.
22da2e3ebdSchin
23da2e3ebdSchin4.	A built-in command named command has been added which is
24da2e3ebdSchin	always found before the PATH search.  Any script which uses
25da2e3ebdSchin	this name as the name of a command (or function) will not
26da2e3ebdSchin	be compatible.
27da2e3ebdSchin
28da2e3ebdSchin5.	The output format for some built-ins has changed.  In particular
29da2e3ebdSchin	the output format for set, typeset and alias now have single
30da2e3ebdSchin	quotes around values that have special characters.  The output
31da2e3ebdSchin	for trap without arguments has a format that can be used as input.
32da2e3ebdSchin
33da2e3ebdSchin6.	With ksh-88, a dollar sign ($') followed by a single quote was
34da2e3ebdSchin	interpreted literally.  Now it is an ANSI-C string.  You
35da2e3ebdSchin	must quote the dollar sign to get the previous behavior.
36da2e3ebdSchin	Also, a $ in front of a " indicates that the string needs
37da2e3ebdSchin	to be translated for locales other than C or POSIX.  The $
38da2e3ebdSchin	is ignored in the C and POSIX locale.
39da2e3ebdSchin
40da2e3ebdSchin7.	With ksh-88, tilde expansion did not take place inside ${...}.
41da2e3ebdSchin	with ksh-93, ${foo-~} will cause tilde expansion if foo is
42da2e3ebdSchin	not set.  You need to escape the ~ for the previous behavior.
43da2e3ebdSchin
44da2e3ebdSchin8.      Some changes in the tokenizing rules where made that might
45da2e3ebdSchin	cause some scripts with previously ambiguous use of quoting
46da2e3ebdSchin	to produce syntax errors.
47da2e3ebdSchin
48da2e3ebdSchin9.	Programs that rely on specific exit values for the shell,
49da2e3ebdSchin	(rather than 0 or non-zero) may not be compatible.  The
50da2e3ebdSchin	exit status for many shell failures has been changed.
51da2e3ebdSchin
52da2e3ebdSchin10.	Built-ins in ksh-88 were always executed before looking for
53da2e3ebdSchin	the command in the PATH variable.  This is no longer true.
54da2e3ebdSchin	Thus, with ksh-93, if you have the current directory first
55da2e3ebdSchin	in your PATH, and you have a program named test in your
56da2e3ebdSchin	directory, it will be executed when you type test; the
57da2e3ebdSchin	built-in version will be run at the point /bin is found
58da2e3ebdSchin	in your PATH.
59da2e3ebdSchin
60da2e3ebdSchin11.	Some undocumented combinations of argument passing to ksh
61da2e3ebdSchin	builtins no longer works since ksh-93 is getopts conforming
62da2e3ebdSchin	with respect to its built-ins.  For example, typeset -8i
63da2e3ebdSchin	previously would work as a synonym for typeset -i8.
64da2e3ebdSchin
65da2e3ebdSchin12.	Command substitution and arithmetic expansion are now performed
66da2e3ebdSchin	on PS1, PS3, and ENV when they are expanded.  Thus,  ` and $(
67da2e3ebdSchin	as part of the value of these variables must be preceded by a \
68da2e3ebdSchin	to preserve their previous behavior.
69da2e3ebdSchin
70da2e3ebdSchin13.	The ERRNO variable has been dropped.
71da2e3ebdSchin
72da2e3ebdSchin14.	If the file name following a redirection symbol contain pattern
73da2e3ebdSchin	characters they will only be expanded for interactive shells.
74da2e3ebdSchin
75da2e3ebdSchin15.	The arguments to a dot script will be restored when it completes.
76da2e3ebdSchin
77da2e3ebdSchin16.	The list of tracked aliases is not displayed with alias unless
78da2e3ebdSchin	the -t option is specified.
79da2e3ebdSchin
80da2e3ebdSchin17.	The POSIX standard requires that test "$arg" have exit status
81da2e3ebdSchin	of 0, if and only if $arg is null.  However, since this breaks
82*b30d1939SAndy Fiddaman	programs that use test -t, ksh-93 treats an explicit test -t
83da2e3ebdSchin	as if the user had entered test -t 1.
84da2e3ebdSchin
85da2e3ebdSchin18.	The ^T directive of emacs mode has been changed to work the
86da2e3ebdSchin	way it does in gnu-emacs.
87da2e3ebdSchin
88da2e3ebdSchin19.	ksh-88 allowed unbalanced parenthes within ${name op val} whereas
89da2e3ebdSchin	ksh-93 does not.  Thus, ${foo-(} needs to be written as ${foo-\(}
90da2e3ebdSchin	which works with both versions.
91da2e3ebdSchin
92da2e3ebdSchin20.     kill -l in ksh-93 lists only the signal names, not their numerical
93da2e3ebdSchin	values.
94da2e3ebdSchin
95da2e3ebdSchin21.	Local variables defined by typeset are statically scoped in
96*b30d1939SAndy Fiddaman	ksh-93.  In ksh-88 they were dynamically scoped although this
97da2e3ebdSchin	behavior was never documented.
98da2e3ebdSchin
99da2e3ebdSchin22.	The value of the variable given to getopts is set to ? when
100da2e3ebdSchin	the end-of-options is reached to conform to the POSIX standard.
101da2e3ebdSchin
102da2e3ebdSchin23.	Since the POSIX standard requires that octal constants be
103da2e3ebdSchin	recongnized, doing arithmetic on typeset -Z variables can
104*b30d1939SAndy Fiddaman	yield different results that with ksh-88.  Most of these
105*b30d1939SAndy Fiddaman	differences were eliminated in ksh-93o.  Starting in ksh-93u+, the
106*b30d1939SAndy Fiddaman	let command no longer recognizes octal constants starting with 0
107*b30d1939SAndy Fiddaman	for compatibility with ksh-88 unless the option letoctal is on.
108da2e3ebdSchin
109*b30d1939SAndy Fiddaman24.	Starting after ksh-93l, If you run ksh name, where name does
110da2e3ebdSchin	not contain a /, the current directory will be searched
111da2e3ebdSchin	before doing a path search on name as required by the POSIX
112da2e3ebdSchin	shell standard.
113da2e3ebdSchin
114*b30d1939SAndy Fiddaman25.	In ksh-93, cd - will output the directory that it changes
115*b30d1939SAndy Fiddaman	to on standard output as required by X/Open.  With ksh-88,
116da2e3ebdSchin	this only happened for interactive shells.
117da2e3ebdSchin
118da2e3ebdSchin26.	As an undocumented feature of ksh-88, a leading 0 to an
119da2e3ebdSchin	assignment of an integer variable caused that variable
120da2e3ebdSchin	to be treated as unsigned.  This behavior was removed
121*b30d1939SAndy Fiddaman	starting in ksh-93p.
122da2e3ebdSchin
123*b30d1939SAndy Fiddaman27.	The getopts builtin in ksh-93 requires that optstring contain
124da2e3ebdSchin	a leading + to allow options to begin with a +.
125da2e3ebdSchin
126da2e3ebdSchin28.	In emacs/gmacs mode, control-v will not display the version when
127da2e3ebdSchin	the stty lnext character is set to control-v or is unset.
128da2e3ebdSchin	The sequence escape control-v will display the shell version.
129da2e3ebdSchin
130*b30d1939SAndy Fiddaman29.	In ksh-88, DEBUG traps were executed. after each command.  In ksh-93
1317c2fbfb3SApril Chin	DEBUG traps are exeucted before each command.
1327c2fbfb3SApril Chin
133*b30d1939SAndy Fiddaman30.	In ksh-88, a redirection to a file name given by an empty string was
134*b30d1939SAndy Fiddaman	ignored.  In ksh-93, this is an error.
135da2e3ebdSchinI am interested in expanding this list so please let me know if you
136da2e3ebdSchinuncover any others.
137