1*da2e3ebdSchinThis is a list of changes that have been made since the 11/16/88 version 2*da2e3ebdSchinof ksh. 3*da2e3ebdSchin 4*da2e3ebdSchin1. New features in 12/28/93 5*da2e3ebdSchin a. Associative arrays. The new version of ksh supports both 6*da2e3ebdSchin associate arrays and the older indexed arrays with the same 7*da2e3ebdSchin array syntax. A new -A option of typeset is used to declare 8*da2e3ebdSchin an array to be associative. As with indexed arrays, $name is 9*da2e3ebdSchin equivalent to ${name[0]}. The prefix operator ! was added 10*da2e3ebdSchin to the parameter expansion syntax to expand to the list of 11*da2e3ebdSchin indices. For example, ${!name[@]} expands to the list of array 12*da2e3ebdSchin indices for variable name. 13*da2e3ebdSchin 14*da2e3ebdSchin b. Several additions have been made to shell arithmetic: 15*da2e3ebdSchin 1. The shell now performs floating point arithmetic. The 16*da2e3ebdSchin typeset options -F and -E have been added for floating 17*da2e3ebdSchin point and scientific notation respectively. 18*da2e3ebdSchin 2. The prefix and postfix ++ and -- operators. 19*da2e3ebdSchin 3. The comma and ?: operators. 20*da2e3ebdSchin 4. The math library functions. 21*da2e3ebdSchin 5. An arithmetic for statement of the form 22*da2e3ebdSchin for ((expr1; expr2; expr3)) 23*da2e3ebdSchin do ... 24*da2e3ebdSchin done 25*da2e3ebdSchin 6. Integer arithmetic extended up to base 64. 26*da2e3ebdSchin 27*da2e3ebdSchin c. Some additions to the macro expansion syntax have been made 28*da2e3ebdSchin to specify substrings and sub-arrays: 29*da2e3ebdSchin 1. ${name:expr} expands to the substring of ${name} starting at 30*da2e3ebdSchin the character position defined by arithmetic expression expr. 31*da2e3ebdSchin 2. ${name:expr1:expr2} expands to the substring of ${name} starting 32*da2e3ebdSchin at expr1 and consisting of at most expr2 characters. 33*da2e3ebdSchin 3. ${name[@]:expr} expands to the values of ${name[@]} starting at 34*da2e3ebdSchin the element defined by arithmetic expression expr. 35*da2e3ebdSchin 4. ${name[@]:expr1:expr2} expands to at most expr2 values of 36*da2e3ebdSchin ${name} starting at expr1. 37*da2e3ebdSchin 5. ${@:expr} expands the positional parameters starting at expr. 38*da2e3ebdSchin 6. ${@:expr1:expr2} expands to at most expr2 positional parameters 39*da2e3ebdSchin starting at expr1. 40*da2e3ebdSchin 7. ${!name} expands to the name of the variable named by name. 41*da2e3ebdSchin It will expand to name unless name is reference variable. 42*da2e3ebdSchin 8. ${!name[sub]} expands to the name of the subscript of the 43*da2e3ebdSchin given variable. If sub is @ or * the list of subscripts 44*da2e3ebdSchin is generated. 45*da2e3ebdSchin 9. ${!prefix*} and ${!prefix@} expand to the list of variable 46*da2e3ebdSchin names beginning with prefix. 47*da2e3ebdSchin 10. The substring operators, # and % can be now be applied 48*da2e3ebdSchin with aggregates (@ or *) and are applied to each. 49*da2e3ebdSchin 11. ${name/pattern/string} expands to the value of name with 50*da2e3ebdSchin the first occurrence of pattern replaced by string. 51*da2e3ebdSchin With aggregates (@ or *) this operation is applied to each. 52*da2e3ebdSchin 12. ${name/#pattern/string} Same as above but the pattern 53*da2e3ebdSchin to be replaced must match at the beginning. 54*da2e3ebdSchin 13. ${name/%pattern/string} Same as above but the pattern 55*da2e3ebdSchin to be replaced must match at the end. 56*da2e3ebdSchin 14. ${name//pattern/string} expands to the value of name with 57*da2e3ebdSchin the each occurrence of pattern replaced by string. 58*da2e3ebdSchin With aggregates (@ or *) this operation is applied to each. 59*da2e3ebdSchin 60*da2e3ebdSchin d. The name space for variables has been extended. The character '.' 61*da2e3ebdSchin can be used at the beginning of a name, and to separate identifiers 62*da2e3ebdSchin within a name. However, to create a name of the form, foo.bar, 63*da2e3ebdSchin the variable foo must exist. The namespace starting with .sh 64*da2e3ebdSchin is reserved for shell implementation variables. Exported 65*da2e3ebdSchin variable cannot contain a '.'. 66*da2e3ebdSchin 67*da2e3ebdSchin e. Compound assignments. The assignment syntax, varname=value, 68*da2e3ebdSchin has been extended to allow assignments of the form 69*da2e3ebdSchin varname=(assignment_list). As elsewhere in the shell 70*da2e3ebdSchin spaces or tabs are optional around the parentheses, and 71*da2e3ebdSchin no space is permitted between the varname and the =. The 72*da2e3ebdSchin assignment_list can be one of the following: 73*da2e3ebdSchin 1. A list of words. In this case each word is expanded as 74*da2e3ebdSchin in a for list and the resulting items become elements 75*da2e3ebdSchin of the indexed array varname. 76*da2e3ebdSchin 2. A list of subscript assignments in the form 77*da2e3ebdSchin [subscript]=value. In this, these elements become 78*da2e3ebdSchin elements of the associative array varname. 79*da2e3ebdSchin 3. A list of assignments; simple or compound. In this 80*da2e3ebdSchin case, each assignment is made to varname.name, where 81*da2e3ebdSchin name is the name of the enclosed assignment. 82*da2e3ebdSchin 4. Assignments in the form of readonly or typeset 83*da2e3ebdSchin statements. In this case each assignment is made as 84*da2e3ebdSchin in 3 above, and the attributes are given to the 85*da2e3ebdSchin corresponding variable. 86*da2e3ebdSchin In case 3 and 4 above, the value of "$varname" after 87*da2e3ebdSchin the above assignment is (assignment_list), where the 88*da2e3ebdSchin assignment_list produced would reproduce all of the 89*da2e3ebdSchin variables under varname.*. 90*da2e3ebdSchin 91*da2e3ebdSchin f. Function names of the form variable.action (called discipline 92*da2e3ebdSchin functions) can be defined where variable is any valid variable 93*da2e3ebdSchin name and action is get, set, or unset. The function variable.get 94*da2e3ebdSchin is invoked each time the variable is referenced. The set 95*da2e3ebdSchin discipline is invoked each time the variable is assigned to. 96*da2e3ebdSchin The unset discipline is invoked when a variable is unset. 97*da2e3ebdSchin The new variables .sh.name, .sh.subscript, and .sh.value are 98*da2e3ebdSchin defined inside the function body. Other shell extensions 99*da2e3ebdSchin may have their own set of discipline functions. 100*da2e3ebdSchin 101*da2e3ebdSchin g. The compound command !, which negates the return value of the 102*da2e3ebdSchin following pipeline, has been added. 103*da2e3ebdSchin 104*da2e3ebdSchin h. On systems that support dynamic loading with dlopen(), it is 105*da2e3ebdSchin now possible to add built-in commands at runtime with the 106*da2e3ebdSchin a builtin command named builtin. 107*da2e3ebdSchin 108*da2e3ebdSchin i. The following builtins have been added: 109*da2e3ebdSchin 1. command name [ ... ] 110*da2e3ebdSchin 2. sleep [decimal-seconds] 111*da2e3ebdSchin 3. builtin [-ds] [-f file] [name...] 112*da2e3ebdSchin 4. getconf name [pathname] 113*da2e3ebdSchin 5. disown [job...] 114*da2e3ebdSchin 115*da2e3ebdSchin j. An addition format for literal strings, $'....' can 116*da2e3ebdSchin be used where ever literal strings are valid. The string 117*da2e3ebdSchin inside the single quotes will be converted using the ANSI-C 118*da2e3ebdSchin escape conventions. Additionally, the escape sequence \E 119*da2e3ebdSchin expands to the escape character (default \033) whenever ANSI-C 120*da2e3ebdSchin escape sequences are recognized. 121*da2e3ebdSchin 122*da2e3ebdSchin k. A typeset -n option has been added which causes the value of a 123*da2e3ebdSchin variable to be treated as a reference to another variable so that 124*da2e3ebdSchin variables can be indirectly named. For example, if $1 contains 125*da2e3ebdSchin the name of a variable, then typeset -n foo=$1 causes the variable 126*da2e3ebdSchin foo to be synonymous with the variable whose name is $1. A builtin 127*da2e3ebdSchin alias, nameref='typeset -n' has been added to aid mnemonics. 128*da2e3ebdSchin Reference names cannot contain a '.'. Whenever that portion of 129*da2e3ebdSchin a variable up to the first '.' matches a reference name, the 130*da2e3ebdSchin reference value is substituted. For example, with nameref foo=.top, 131*da2e3ebdSchin then ${foo.bar} is equivalent to ${.top.bar}. When used as the 132*da2e3ebdSchin index of a for or select loop, each assignment causes a 133*da2e3ebdSchin new name reference to occur. 134*da2e3ebdSchin 135*da2e3ebdSchin l. The KEYBD trap has been added which is triggered when a key 136*da2e3ebdSchin or escape sequence is typed while reading from the keyboard 137*da2e3ebdSchin in an edit mode. This, combined with some new variables 138*da2e3ebdSchin makes it possible to program your key bindings in ksh. 139*da2e3ebdSchin 140*da2e3ebdSchin m. New variables have been added: 141*da2e3ebdSchin 1. FIGNORE defines a set of file names to be ignored in each 142*da2e3ebdSchin directory when performing pathname expansion, replacing 143*da2e3ebdSchin the rule that requires that a leading . be matched explicitly. 144*da2e3ebdSchin 2. Variable sh.edchar contains the value of the keyboard character 145*da2e3ebdSchin that has been entered when processing a KEYBD trap. If the value 146*da2e3ebdSchin is changed as part of the trap action, then the new value replaces 147*da2e3ebdSchin the key or keys that caused the trap. 148*da2e3ebdSchin 3. Variable sh.edcol is set to the character position of the cursor 149*da2e3ebdSchin within the input buffer during a KEYBD trap. 150*da2e3ebdSchin 4. Variable sh.edmode is set to the escape character when in vi 151*da2e3ebdSchin insert mode. 152*da2e3ebdSchin 5. Variable sh.edtext is set to the contents of the input buffer 153*da2e3ebdSchin during a KEYBD trap. 154*da2e3ebdSchin 6. HISTEDIT is checked before FCEDIT. FCEDIT is obsolete. 155*da2e3ebdSchin 7. HISTCMD is the number of the current command in the history 156*da2e3ebdSchin file. 157*da2e3ebdSchin 8. Variable .sh.version is set to the version string for 158*da2e3ebdSchin this shell. 159*da2e3ebdSchin 9. Variable .sh.name is set to the name of the variable 160*da2e3ebdSchin that that was referenced or assigned to when executing a get 161*da2e3ebdSchin or set discipline function. 162*da2e3ebdSchin 10. Variable .sh.subscript is set to the subscript for the variable 163*da2e3ebdSchin that was referenced or assign to when executing a get or 164*da2e3ebdSchin set discipline function. 165*da2e3ebdSchin 11. Variable .sh.value is set to the new value for the variable 166*da2e3ebdSchin that was assigned to when executing the set discipline function. 167*da2e3ebdSchin 168*da2e3ebdSchin n. New invocation and set -o options have been added: 169*da2e3ebdSchin 1. set -o notify (or set -b) causes background completion messages 170*da2e3ebdSchin to be displayed as soon as the job completes. 171*da2e3ebdSchin 2. There is a compile time option named KIA which enables 172*da2e3ebdSchin creation of a relational database for commands, variables 173*da2e3ebdSchin and functions defined and referenced by a script. The 174*da2e3ebdSchin option -I <filename>, causes the database to be generated 175*da2e3ebdSchin in <filename>. The database format can be queried via 176*da2e3ebdSchin the cql command. 177*da2e3ebdSchin o. ksh93 can read and evaluate pre-compiled scripts generated by 178*da2e3ebdSchin a separate program called shcomp. 179*da2e3ebdSchin p. More work on internationalization has been added: 180*da2e3ebdSchin 1. The decimal point character is processed per locale 181*da2e3ebdSchin 2. A $ can be placed in front of each string to indicate 182*da2e3ebdSchin that the string needs translation but is otherwise ignored. 183*da2e3ebdSchin This means that if a message catalog of all $"..." strings 184*da2e3ebdSchin is generated, then a program such as print $"hello world" 185*da2e3ebdSchin could display "bonjour monde" in the french locale. 186*da2e3ebdSchin q. Backreferences have been added to pattern matching. The sequence 187*da2e3ebdSchin \d, where d is a digit from 1-9, matches the same string as 188*da2e3ebdSchin the d-th previous parenthesis group. Backreferences 189*da2e3ebdSchin can be used within patterns, and within replacement strings 190*da2e3ebdSchin with any of the ${name/...} operators. 191*da2e3ebdSchin 192*da2e3ebdSchin2. Changes made in 12/28/93 193*da2e3ebdSchin a. The output format of many commands has changed as follows: 194*da2e3ebdSchin 1. System error messages are displayed whenever a failure 195*da2e3ebdSchin is caused by a system call. 196*da2e3ebdSchin 2. The exit status has changed in many cases: 197*da2e3ebdSchin a. USAGE messages cause an exit status of 2. 198*da2e3ebdSchin b. Commands not found cause exit - 127. 199*da2e3ebdSchin c. Command found, but not executable - 126. 200*da2e3ebdSchin d. Terminated because of signal - 256+sig 201*da2e3ebdSchin 3. The output of values from built-ins that contain special 202*da2e3ebdSchin characters are quoted in a manner that then can be re-input. 203*da2e3ebdSchin 4. The trace output puts quotes around the output so that it 204*da2e3ebdSchin can be reused as input. 205*da2e3ebdSchin 5. The output for trap is in a format that can be reinput the 206*da2e3ebdSchin the shell to restore the traps. 207*da2e3ebdSchin 6. kill -l lists the signal names without numbers as 208*da2e3ebdSchin required by the POSIX standard. 209*da2e3ebdSchin 210*da2e3ebdSchin b. The following changes have been made to shell functions: 211*da2e3ebdSchin 1. The semantics of functions declared with name() has changed 212*da2e3ebdSchin to conform with the IEEE-POSIX 1003.2 standard. In particular, 213*da2e3ebdSchin these functions are executed in a dot script environment rather 214*da2e3ebdSchin than a separated function environment so that there are no 215*da2e3ebdSchin local variables and no scoping for traps. 216*da2e3ebdSchin 2. Functions declared as function name, preserve the old ksh 217*da2e3ebdSchin semantics can be also used as the first argument to the dot (.) 218*da2e3ebdSchin command to have them executed in a dot script environment. 219*da2e3ebdSchin 220*da2e3ebdSchin c. The command search rules have changed as follows: 221*da2e3ebdSchin 1. Special built-ins (those with a dagger in front of them) are 222*da2e3ebdSchin executed first. 223*da2e3ebdSchin 2. Functions are executed next. 224*da2e3ebdSchin 3. Other built-ins that do not require an executable version 225*da2e3ebdSchin (for example cd and read) come next. 226*da2e3ebdSchin 4. If the command name contains a slash, the pathname corresponding 227*da2e3ebdSchin to the command name is executed. 228*da2e3ebdSchin 5. If name corresponds to a previously encountered pathname 229*da2e3ebdSchin on the PATH variable, the corresponding command is executed. 230*da2e3ebdSchin 6. If the command name does not contain a slash, then the PATH 231*da2e3ebdSchin variable is used to find an executable by that name. If 232*da2e3ebdSchin the directory that the command is found is also contained in 233*da2e3ebdSchin the FPATH variable, then the command treated as a function. 234*da2e3ebdSchin If the shell has a built-in version of the command corresponding 235*da2e3ebdSchin to this command, then the built-in version of this command 236*da2e3ebdSchin is executed. Otherwise, the shell remembers that pathname 237*da2e3ebdSchin corresponding to this command name and executes this pathname. 238*da2e3ebdSchin 7. If the name is not found on PATH, then the directories in 239*da2e3ebdSchin FPATH are searched. If found, then the command is executed 240*da2e3ebdSchin as a function. 241*da2e3ebdSchin 242*da2e3ebdSchin d. Built-in commands options now conform to the IEEE-POSIX 1003.2 243*da2e3ebdSchin conventions with some additions. In particular, 244*da2e3ebdSchin name -? 245*da2e3ebdSchin will now print a Usage line for name, except for true, false, 246*da2e3ebdSchin colon, login, newgrp, echo, [, and command. 247*da2e3ebdSchin 248*da2e3ebdSchin e. Tilde expansion is now performed as part of the word expansions. 249*da2e3ebdSchin The effect of this is that if word begins with ~ in ${name op word}, 250*da2e3ebdSchin it will be expanded unless escaped. 251*da2e3ebdSchin 252*da2e3ebdSchin f. Pathname expansion is no longer performed on redirection words 253*da2e3ebdSchin unless the shell is interactive. 254*da2e3ebdSchin 255*da2e3ebdSchin g. Changes to shell and options: 256*da2e3ebdSchin 1. The -n option has been enhanced to produce more warning and 257*da2e3ebdSchin portability messages. 258*da2e3ebdSchin 2. The -C option is equivalent to -o noclobber. Files are 259*da2e3ebdSchin created with O_EXCL when -C is on. 260*da2e3ebdSchin 261*da2e3ebdSchin h. The following changes have been made to [[...]]: 262*da2e3ebdSchin 1. A string by itself is equivalent to -n string. 263*da2e3ebdSchin 2. -e has been added as equivalent to -a. 264*da2e3ebdSchin 3. == has been added as equivalent =. 265*da2e3ebdSchin 4. -a and = are now considered obsolete. 266*da2e3ebdSchin 5. Arithmetic comparisons are now considered obsolete. 267*da2e3ebdSchin 268*da2e3ebdSchin i. kill has been changed as follows: 269*da2e3ebdSchin 1. Signal names can be upper case or lower case. 270*da2e3ebdSchin 2. Numerical arguments to kill -l cause the given signal names to 271*da2e3ebdSchin be displayed. 272*da2e3ebdSchin 3. String arguments to kill -l cause the given signal numbers to 273*da2e3ebdSchin be displayed. 274*da2e3ebdSchin 4. Synopsis changed for getopts conformance. 275*da2e3ebdSchin 276*da2e3ebdSchin j. print has a -f format option which is equivalent to 277*da2e3ebdSchin the IEEE POSIX printf. Both print -f format, and 278*da2e3ebdSchin printf have the following extensions from IEEE POSIX: 279*da2e3ebdSchin 1. Floating point formats are supported. 280*da2e3ebdSchin 2. Size and precision specifications can be *. 281*da2e3ebdSchin 3. The %d option can take an argument after precision to 282*da2e3ebdSchin specify the base that the number will be displayed. 283*da2e3ebdSchin 4. A %q format can be used to output a string quoted so 284*da2e3ebdSchin that it can be re-input to the shell. 285*da2e3ebdSchin 5. A %P format can be used to output the shell pattern which 286*da2e3ebdSchin corresponds to the give extended regular expression. 287*da2e3ebdSchin 6. For numerical fields, the arguments can be arithmetic 288*da2e3ebdSchin expressions which will be evaluated. 289*da2e3ebdSchin 7. The %n format works as described in ANSI-C. 290*da2e3ebdSchin 291*da2e3ebdSchin k. The following changes have been made to fc: 292*da2e3ebdSchin 1. It has been renamed hist. fc is now a predefined alias. 293*da2e3ebdSchin 2. hist uses ${HISTEDIT:-$FCEDIT}. FCEDIT is obsolete. 294*da2e3ebdSchin 3. A new -s option is equivalent to the obsolete -e -. 295*da2e3ebdSchin 4. If the first argument refers to a command earlier than the 296*da2e3ebdSchin first accessible command, it now implies the first accessible 297*da2e3ebdSchin command, so that hist -l 1 lists all accessible history commands. 298*da2e3ebdSchin 299*da2e3ebdSchin l. The dot command (.) has changed as follows: 300*da2e3ebdSchin 1. The argument can be the name of a function declared as 301*da2e3ebdSchin function name. The function will execute without creating a 302*da2e3ebdSchin new scope. 303*da2e3ebdSchin 2. If there are arguments to the given script or function, 304*da2e3ebdSchin the positional parameters are restored to their original 305*da2e3ebdSchin value when . completes. 306*da2e3ebdSchin 307*da2e3ebdSchin m. The read built-in has been changed as follows: 308*da2e3ebdSchin 1. A -A option to read has been added to allow the fields to be 309*da2e3ebdSchin read into an indexed array. 310*da2e3ebdSchin 2. A -t n option has been added which causes read to 311*da2e3ebdSchin timeout after n seconds when reading from a slow device. 312*da2e3ebdSchin 3. A -d char option has been added which causes the read 313*da2e3ebdSchin to terminate at char rather than at new-line. 314*da2e3ebdSchin 315*da2e3ebdSchin n. The trap command has been changed as follows: 316*da2e3ebdSchin 1. Trap names can be either upper case or lower case. 317*da2e3ebdSchin 2. Trap -p cause only the specified trap values to be displayed. 318*da2e3ebdSchin 3. The value of trap in a subshell will be the value in the parent 319*da2e3ebdSchin shell until a call to trap which changes the trap settings has 320*da2e3ebdSchin been made. Thus, savetraps=$(trap) works as required by the 321*da2e3ebdSchin POSIX standard. 322*da2e3ebdSchin 323*da2e3ebdSchin o. The exec command has been extended as follows: 324*da2e3ebdSchin 1. The -c option clears the environment first. 325*da2e3ebdSchin 2. The -a name option sets argv[0] to name for the program. 326*da2e3ebdSchin 327*da2e3ebdSchin p. true and false are built-ins, not aliases to built-ins. 328*da2e3ebdSchin 329*da2e3ebdSchin q. test has been modified to conform to the IEEE-POSIX 1003.2 330*da2e3ebdSchin standard when there are three or less arguments. 331*da2e3ebdSchin 332*da2e3ebdSchin r. umask -S option displays the mask in a symbolic format. 333*da2e3ebdSchin 334*da2e3ebdSchin s. wait now returns the correct exit status of any previous 335*da2e3ebdSchin background job that has not been waited for, not just 336*da2e3ebdSchin the most recent one. 337*da2e3ebdSchin 338*da2e3ebdSchin t. The whence built-in has an option -a which causes all 339*da2e3ebdSchin uses for the given command name to be reported. 340*da2e3ebdSchin 341*da2e3ebdSchin u. unalias has -a option to clear all the aliases. 342*da2e3ebdSchin 343*da2e3ebdSchin v. The times built-in command has been removed. The time 344*da2e3ebdSchin reserved word, without a command, gives time cumulative 345*da2e3ebdSchin time for the shell and its children. A built-in alias 346*da2e3ebdSchin for times should enable scripts using times to continue 347*da2e3ebdSchin to run. 348*da2e3ebdSchin 349*da2e3ebdSchin w. Command substitution and arithmetic substitution will now be 350*da2e3ebdSchin performed for PS1, ENV, and PS4 evaluation in addition to 351*da2e3ebdSchin parameter expansion. 352*da2e3ebdSchin 353*da2e3ebdSchin x. The SECONDS variable now displays elapsed time in floating 354*da2e3ebdSchin point seconds with 3 places after the decimal point by 355*da2e3ebdSchin default. 356*da2e3ebdSchin 357*da2e3ebdSchin y. The getopts built-in now handles the complete libast optget 358*da2e3ebdSchin functionality. If any errors have occurred with getopts 359*da2e3ebdSchin when it has reached the end of arguments, then the Usage 360*da2e3ebdSchin message will be generated from the option string and the 361*da2e3ebdSchin exit status from getopts will be 2 rather than 1. The 362*da2e3ebdSchin usage message will be stored in the OPTARG variable if 363*da2e3ebdSchin the option string contains a leading colon; otherwise 364*da2e3ebdSchin it will be printed on standard error automatically. 365*da2e3ebdSchin 366*da2e3ebdSchin z. THE ENV file is only processed for interactive shell 367*da2e3ebdSchin invocations. In addition, the -x attributes for 368*da2e3ebdSchin aliases and functions is ignored. 369*da2e3ebdSchin 370*da2e3ebdSchin aa. The built-in edit modes have been changed as follows: 371*da2e3ebdSchin 1. The pathname completion and pathname listing options 372*da2e3ebdSchin now perform command completion and command listing 373*da2e3ebdSchin when applied to a word in the command position. 374*da2e3ebdSchin 2. In emacs mode ^N as the first related command after 375*da2e3ebdSchin the prompt will move to the next command relative to the 376*da2e3ebdSchin last known history position. 377*da2e3ebdSchin 3. In emacs mode, successive kill and delete commands will 378*da2e3ebdSchin accumulate their data in the kill buffer, by appending or 379*da2e3ebdSchin prepending as appropriate. This mode will be reset by any 380*da2e3ebdSchin command not adding something to the kill buffer. 381*da2e3ebdSchin 4. The control-T of emacs mode has been changed to behave like 382*da2e3ebdSchin control-T in gnu-emacs. 383*da2e3ebdSchin bb. The TMOUT variable also sets a limit for select timeouts 384*da2e3ebdSchin and default timeouts for read. 385*da2e3ebdSchin 386*da2e3ebdSchin 387*da2e3ebdSchin4. The source code has undergone significant modification. 388*da2e3ebdSchin a. Much of the code has been rewritten, In many cases this has 389*da2e3ebdSchin resulted in significant performance improvement. 390*da2e3ebdSchin 391*da2e3ebdSchin b. The code is organized differently. See the README files 392*da2e3ebdSchin for more details. 393*da2e3ebdSchin 394*da2e3ebdSchin c. Most configuration parameters now get generated using 395*da2e3ebdSchin the FEATURE mechanism of nmake. Other options are set 396*da2e3ebdSchin in the OPTIONS file. 397*da2e3ebdSchin 398*da2e3ebdSchin c. The are several new compile time options. See the README 399*da2e3ebdSchin file for details. Some of the old ones have been removed. 400*da2e3ebdSchin 401*da2e3ebdSchin d. The install script is a Mamfile that is generated by 402*da2e3ebdSchin nmake and processed by a script that comes with the 403*da2e3ebdSchin distribution. 404*da2e3ebdSchin 405*da2e3ebdSchin e. There are far fewer global names. This should make it 406*da2e3ebdSchin must easier to add built-in commands without worrying 407*da2e3ebdSchin about conflicts. 408*da2e3ebdSchin 409*da2e3ebdSchin f. The code uses the sfio library which makes it possible 410*da2e3ebdSchin to mix with stdio. 411*da2e3ebdSchin 412*da2e3ebdSchin g. The code is written in ANSI C with full prototypes. 413*da2e3ebdSchin The code is based on the IEEE POSIX 1003.1 standard. 414*da2e3ebdSchin The code can be compiled with K&R C and with C++ by 415*da2e3ebdSchin using the ANSI cpp that comes with nmake or running 416*da2e3ebdSchin the code through the proto filter before pre-processing. 417*da2e3ebdSchin This happens automatically with our shipping system. 418*da2e3ebdSchin 419*da2e3ebdSchin h. There is a programming interface for capturing references 420*da2e3ebdSchin and assignment to shell variables. It is also possible 421*da2e3ebdSchin to intercept variable creation and supply the array processing 422*da2e3ebdSchin function for that variable. See nval.3 for a description. 423