This is a list of changes that have been made since the 06/03/86 version of ksh. 1. New features in 11/16/88 a. Additional pattern matching capabilities have been added. A pattern-list is one or more patterns separated by |. The following can now be all or part of a pattern: 1. ?(pattern-list) - allows any pattern to be optional 2. *(pattern-list) - matches zero or more of any pattern 3. +(pattern-list) - matches one or more of any pattern 4. @(pattern-list) - matches one of any pattern. The @ is optional for nested patterns. 5. !(pattern-list) - matches everything, except any of the patterns. b. A new compound command beginning with the new reserved word [[ and ending with the new reserved word ]] has been added. This compound command is intended to replace both test and [. The operators && and || replace -a and -o. Unquoted parenthesis are used for grouping. The words between [[ and ]] are not expanded for word splitting and pathname expansion. The operators = and != allow the right hand side to be a pattern. You can also specify < and > within [[ ]] to compare two strings. Also the following test primitives have been added to test, [ and [[: 1. -O file, returns true if file is owned by effective user. 2. -G file, returns true if file is owned by effective group. 3. -S file, returns true if file is of type socket. 4. -a file, returns true if file exists. 5. -o option, returns true if option is on. 6. Extra arguments are no longer result in an error. This increases compatibility with the Bourne shell. 7. File names of the form /dev/fd/NN can be used to check the attributes for file descriptor NN. c. The operators &&, ||, &, |, ^, <<, >> and ~ have been added the the arithmetic evaluator. You can use them in any arithmetic expression. Also, all the assignments operators, +=, etc. are now recognized by ksh. The precedences and associativity of ksh arithmetic operators are the same as those of the C programming language. d. Several options have been added or changed. 1. A noclobber option has been added. With noclobber set, > file produces an error when file exists. Use >| file to write to file even if noclobber is set. 2. A nolog option has been added. Nolog disables the saving of the source for functions in the history file. 3. bgnice is now turned on by default when interactive. 4. The meaning of the -p option has been changed as well as its name. In the previous version, -p caused the path to be reset to a default value and the shell not to run your personal .profile and $ENV file. Instead, the shell executed a file named /etc/suid_exec. The -p option was enabled automatically whenever the real and effective user or group id were not equal. This was called the protective option. With the new release, the -p no longer resets the path to a default value. In addition, the effective user id and group id are set to the real user id and group id unless the shell has been invoked with the -p options which is now called privileged. In addition, turning off privileged, (set +p) sets the effective ids to their real values. On some systems you the command set -p will restore the permissions to the way that they were before the set +p. e. Six new variables have been added. ERRNO - set to the value of errno after each system call. LINENO - set to the line number of current command. PS4 - evaluates to prompt used with set -x, default '+ '. FPATH - used to search for function definitions. The FPATH directories are searched after the PATH variable. If a file is found, it is dotted into the environment and then it tries to execute a function of the given name. The declaration typeset -fu name, causes name to be searched for in FPATH directories before searching PATH. A preset alias, autoload='typeset -fu', has been added. OPTARG - used with the getopts built-in. OPTIND - used with the getopts built-in. f. The following changes and additions have been made to the editing modes: 1. Searches starting with a ^ now only match at the beginning of the line in both emacs and vi mode. 2. Searches are performed much faster than with earlier versions. 3. The | directive has been added to vi 4. The r directive of vi can now be preceded by a count. 5. The new vi directive \ causes the current word to be extended as far as possible as long as it matches a unique pathname. 6. Emacs now behaves like vi \ above. 7. Undefined sequences in emacs now beep. 8. Emacs keeps prompt on screen when scrolling. 9. Last delete saved across commands in emacs. 10. M-^]c, moves back to character c. g. A DEBUG trap has been added to aid debugging. This trap gets executed after each statement. Also, set -x now displays I/O redirections. h. You can now assign an array with set -A array_name value... i. Aliases will now be expanded inside other alias. Thus, if alias foo=bar bar=bam then foo will expand to bam. However, an alias will not re-expand within its own expansion so you can alias ls='ls -C'. If you alias foo=bar bar=foo, then foo will expand to foo and bar will expand to bar. j. The commands typeset and alias now allow option arguments as separate words, rather than all in one word. For example, typeset -ux and typeset -u -x. Also commands that allow multiple options, now allow you to specify -- as an indicator that there are not more options. This is needed in case the next argument starts with a -. k. The attributes for exported variables are now passed through then environment. Thus setting a variable readonly and exporting it will cause it to be readonly whenever a shell is invoked. The IFS parameter is reset to the default value even if you export it, after reading the environment file. l. If the last element of a pipeline is a built-in, a compound command or a function, then it is now executed in the current process environment. If you require the previous semantics then you must use parenthesis. All the other elements of a pipeline are carried out in a separate environment and any changes are not brought back to the parent environment. This remains a caveat and you should use parenthesis if you require that they be carried out in a separate environment. m. The ~ expansion now uses yellow pages on systems that provide this network service. n. The expansions for ~, ~+ and ~- have been changed to expand to $HOME, $PWD and $OLDPWD respectively. Previously, they returned the value of the home directory, the present working directory and the previous working directory at the time they were read. This caused surprising results when used within scripts or functions. o. The getopts built-in from System V release 3 has been added. p. You can now move the file descriptors for a cooperating process (a job followed by |&), to numbered files by using exec n<&p for the read descriptor and exec n>&p for the write descriptor, where n is a digit. Once you move this descriptor you can close it or redirect any command to or from it. q. The built-in commands break, continue, and exit now behave like special built-ins and have a dagger in front of them on the man page. r. Each pattern in a case statement will now allow an optional open parenthesis. The open parenthesis is required when a case statement is part of a $() command substitution. s. The previously unadvertised <> redirection operator, now works. This operator causes a file to be opened for read and write. The file is not truncated. t. The alert character sequence \a has been added as an escape sequence to the echo and print built-in commands. The sequence \a will expand to the ASCII Bell character. u. When ksh reads an unquoted ${, it now reads until the matching unquoted } as part of the same word. Thus, you do not need to use quotes to put most blanks and most other special characters inside ${...}. v. Code for BSD style job control for System V is now conditionally compiled with the SIGTSTP signal. These should work with any POSIX conforming job control implementation such as System V Release 4. Also, can now refer to jobs as %?string to match a job that contains string as part of its name. w. A trap on CHLD will be executed when a child process stops or exits. Thus, with monitor mode on, you can set trap 'jobs -n' CHLD to get the csh, set notify behavior. x. The -p option has been added to whence to find the pathname of a given name, even when the name is an alias or function name. y. Options -L and -P have been added to pwd and cd on systems with symbolic links. The default, -L, preserves logical naming so that .. will move up one component towards the root. The physical option, -P, uses a physical model for paths. Thus, if /usr/include/sys > /sys/h, then cd /usr/include/sys;pwd;pwd -P, will print /usr/include/sys followed by /sys/h. A cd .. will put you in /usr/include, whereas a cd -P .. will put you in /sys. z. $((expression)) expands to the value of the enclosed arithmetic expression. aa. The argument to umask can also be a symbolic string in the format of a chmod permission string. 3. Bugs fixed since 06/03/86 a. typeset -LZ2 x, followed by integer x, created a base 2 integer variable x. This now correctly makes x base 10. b. Single quoted strings with adjacent characters $( sometimes did not work correctly. This has been fixed. c. The suid_exec program now works correctly for setuid scripts. The fix in the 06/03/86a release solved the security problem but caused setuid scripts with read permission to fail. d. A bug in the MULTIBYTE version which could cause core dumps on variable assignments has been fixed. e. The following parameter expansion bugs have been fixed: 1. Expansions of the form ${x-'${...}'} incorrectly evaluated to ${x}} when x was set. 2. Expansions of the form ${x+$} and ${x+$\}} displayed the message 'bad substitution' when x is not set. 3. The expansion "${x:=a b}" now expands to a single argument when x is not defined. It previously expanded to two arguments. f. Non-builtin command incorrectly had backslashes removed from the command before execution. Thus '\date' would execute the date command. This has been fixed. g. On some versions of Unix the shell did not die when sent a hangup signal while in an editing mode. This has been fixed. h. Some fixes have been made to the the emacs edit directives. 1. M-< now works as documented. 2. ^N now works correctly after ^P reaches the oldest command from the history file. 3. ^W now works no matter what your backspace character. 4. Scrolling now works correctly when you prompt is longer than half the width of your screen. 5. Pathname completion no longer causes a core dump on system that don't allow references to 0 when you expand a word that expands to a null string, i.e. $foo. 6. M- before a newline or return no longer has an effect. i. Some fixes have been made to the the vi edit directives. 1. Lines of one character in length now work. 2. The . directive now works correctly after the R directive. 3. The ~ directive now works correctly when preceded by a count. 4. The directives c0, d0, cb and db now work. 5. You can now use ESC to cancel r, f and @ directives. 6. On System V, if you have ignoreeof set, and you enter EOF, you no longer receive 'use exit to logout' messages when you subsequently hit ESC. 7. Tabs now get expanded to correct columns when ksh redraws the line. 8. The e and E directives now ring bell when there are no characters on the line. j. Syntax errors in the ENV file now correctly list the name of the ENV file as part of the message. k. The let command when invoked as ((expr)) was fixed to work correctly when expr contained $() or ``. Also subscripts in variable assignments now work correctly when they contain $() and/or ``. l. The if..then..elif..fi now correctly handles redirection. Previously redirection applied only to the elif portion. m. A script containing lines like exec 3 foo x=bar command are now correctly handled. r. The parameter $! now gets set for cooperating processes. s. Under some circumstances a write to an co-process did not flush so that a subsequent read caused the process to hang. This has been fixed. t. When you invoke a shell procedure containing a here document from within a command substitution contained in double quotes, ( "`shell_prog`"), parameter substitutions inside the here document no longer insert extra \'s. u. A bug in line continuation caused lines ending in \x\ not to be continued properly has been fixed. v. The whence built-in command returned the wrong value when you specified a full pathname and there was a tracked alias with the same simple name. This has been fixed. Also whence no always returns an absolute pathname for programs. w. You can now specify typeset -fx before a function is defined to set the x attribute. Before, defining a function cleared the x and t attributes. x. A trap on EXIT from within a function no longer affects the return value of a function. y. set -e and trap on ERR didn't get triggered in some cases where it should have. This has been fixed. z. A bug that caused the shell to hang when the shell timed out and you had a trap on EXIT that did a command substitution has been fixed. aa. On some systems kill -l could cause a core dump. This has been fixed. bb. The ignoreeof option only applies when reading from a tty. This prevents ksh from looping when running sh -i when reading from a pipe or a file. cc. case patterns of the form identifier[ are now processed correctly. dd. On some 16-bit machines $$ and $RANDOM were not getting set correctly. This has been fixed. ee. A space or tab at the end of a command is now placed in the history file when preceded by a \ at the end of a command. ff. ksh can now handle a signal that ksh does not know about. This can happen when a signal ha been added after ksh was compiled. It will print the signal number. On previous versions the results were undefined and could even cause core dumps. gg. In instances where there are unbalanced quotes and ksh allows unbalanced quotes, the results are now the same as bsh. In some cases the last character was lost. For example, x=`:|echo 'abc/` no longer removed the /. hh. sh -n no longer loops indefinitely when you have while looks in your script. Also, -n will make more extensive syntax checks than earlier versions. ii. A bug in read that caused the last field not to get set to null when there were trailing delimiters has been fixed. jj. break 0 no longer puts you in a noexecute mode when entered interactively. kk. ksh no longer dumps core when expanding some long substring patterns. ll. A bug that caused exec not to find a program when a PATH contained relative directory that contained it has been fixed. mm. Setting IFS to a null string, now correctly keeps ksh from splitting up arguments after parameter and command substitution. nn. Unsetting PS1 no longer causes the shell to core dump on systems that cannot access address 0. oo. If a child process terminates with O_NDELAY (or FNDELAY or O_NONBLOCK) set on the terminal, this no longer causes the shell to exit. pp. If you refer to a job using a prefix which is ambiguous, a message is displayed. Previously, the prefix matched the most recent job starting with this prefix. qq. ksh now produces syntax errors when the last element of a pipeline is omitted, for example a | &. rr. Here-documents containing expansions of the form ${x-y}, or other operators, now work correctly when y contains double quotes and/or backslashs. Double quotes are not treated specially inside a here-document and a \ is only special when followed by a $, `, and \. This was a bug in the Bourne shell also. ss. The read built-in now treats \ as an escape character when reading input if you do not specify -r. This is the same as with the Bourne shell. tt. sh -t now works that same as with the Bourne shell. uu. "${x[*]}" now always expands to a single argument. vv. If you do not specify a size with typeset -R, -L, or -Z, the size gets defined on the first assignment. ww. When set -k is on, words in a for list of the form name=value are no longer discarded. xx. A dot script that dots itself recursively, no longer produces a core dump. It now prints an error message. yy. ksh script requires execute permission for script when using PATH to find script. zz. The exit status of all commands is now limited to between 0 and 255. Previously, builtin commands could have other return values. aaa. If the ENV file contained functions that used here documents, then "sh -c prog" no longer leaves temporary files around. bbb. (trap 'echo foobar' 0; date) now executes the exit trap. With Bourne shell and earlier ksh it didn't. ccc. The shell no longer aborts when the history file grows larger than ulimit. ddd. An expansion of the form ${name%/\*} no removes only a trailing /*. Previously in removed / followed by anything. 4. The source code has undergone significant modification. a. The SXT conditional compilation has been removed and all the code in the jsh directory has been stripped out. b. Most configuration parameters now get generated rather than relying on testing which system you are on. This should make it easier to port to hybrid systems. Other options are now set in the OPTIONS file. c. The are several new compile time options. See the README file for details. d. There is no more standard makefiles with this distribution. The build procedure is written in native V7 Bourne shell. There is also a 4th. generation make (nmake) Makefile for those lucky enough to have this tool. e. There are far fewer global names. This should make it must easier to add built-in commands without worrying about conflicts. f. The code no longer uses standard I/O. This should make it easier to port. g. There are ANSI C prototypes for most of the external routines h. Several minor performance enhancements should make startup faster and should make some scripts run faster. 5. Incompatibilities with 06/03/86 version. a. name=value ... is now evaluated left to right in accordance with POSIX. b. Aliases and functions defined in the $ENV file without -x are removed before running a script.