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