Changes for 45.0 (commit log unavailable) - Oh wow, this was a tough job. The Shell really looked like some kind of BCPL left-over. It took several days just to cleanup the code and turn it into something more readable. BCPL was lurking thru the code all over. No more, folks, no more... - The V40 shell was unable to perform the "implicit CD" command properly if the directory name was quoted. It inserted an unnecessary blank space behind the directory name. - The shell didn't support multiple backticks on the command line; the backtick parser was simply broken: Fixed handling of asterisk-backtick sequences. The backtick wasn't escaped properly. - The shell did not treat TABs as blank spaces. Fixed. - Removed the SetClock kludge. Whoever is still using a 1.3 SetClock nowadays cannot be helped anymore and deserves to be crashed. (-; - Added a few missing Forbid/Permit locks around access of the list of resident commands. - Removed an ugly hack to set the RC and Result2 variables; this really uses now the proper system functions and doesn't attempt to hack directly into the variable buffers. - Reworked the parser a lot; it partially tried to fiddle in the internal buffers of file handles using structures that have never been documented. The code now loads full lines at once (no matter how big they are) and then parses within its buffers. This removes all dependencies of implementation details of the file handles. - Arguments to redirection did not expand backticks. Fixed. - Added a lot of proper error checking if it is low on memory. - The internal (and deceased "GlobalVector") is no longer passed thru to all functions. Instead, I'm now using some SAS magic to allocate my data segment myself on each invocaton. - Decided not to disable echo-ing for non-interactive shells. Otherwise, we could not debug scripts or the startup-sequence. Sorry, Heinz, but I reconsidered and it's really better this way. - Shell V45 re-introduces the handling of the "h" bit. Should it find a command with "pure" and "h" bits set, it makes the command resident automatically. Note that this is (again) the V39 behaivour. Note that "h" is for "hold", not for "hidden". - The shell does no longer limit command lines to 512 characters. Command lines can now be unlimited in size, provided the command itself is smaller than the AmigaOs file name size limit (107 characters). The Shell will now auto-expand all of its internal buffers if required to do so. Furthermore, it uses now memory pools for this kind of administration. - The shell offers now extended "script" support. In case a script file - i.e. a file whose "s" and "e" bits are set - starts with either the magic characters "#!" or ";!", the string behind this magic cookie is understood as the path to a command parser that shall execute this script. - Added support for "file browsing". - If the shell encounters now a file as first argument that has its "e" bit cleared (!) and is parsed and recognized as a data- type by the data types system, the shell runs a "viewer" program whose path should be placed in the $VIEWER shell variable. - Added support for "stderr" redirection. Therefore, the V45 shell introduces three new redirection symbols: *> filename : redirects stderr to a file *>> filename : appends output to stderr to a file *>< : redirects stderr to the same file that stdout goes into. - The shell will also assign the console to the stderr stream should stderr be an interactive stream. - Added support for "script stdin". A "<<" will pull the next symbol from the shell script and will push all following lines up to a line starting with this symbol as input into the command. Hence, "<<" is exactly the Un*xoid input redirection. - Added a new command line token, the "&" character, the "implicit run". If found, the shell opens named consoles with of a name generated thru utility/GetUniqueID(), and assigns these to the stdin/stdout/stderr of the command, shouldn't redirection be used anyhow. Then the command is detached from the shell segment. - Added automatic stack size setup for shell commands. This is a new feature that would hopefully limit the number of stack underflows as it allows application developers to increase the stack automatically without the need for stack swap code. The shell scans now the first 1K of each segment of a loaded binary for the magic cookie "$STACK:". The string behind this cookie is expected to be a decimal number, terminated with a line feed (and an ASCII NUL, i.e. '\0', as for all C strings). This number is then interpreted as the stack size in bytes. The shell will automatically increase the stack size *for this command only*. If the pre-defined stack size is larger than the program-implicit, nothing will happen. - AGENDA: Rewrite the parser for shell-variables. This looks currently messy and not very well thought-about. Especially the handling of asterisks is broken here. Rewrite the parser for backticks. This happend already to some degree, but it is not yet perfect. Changes for 45.1 (commit log unavailable) - The shell did not handle script files correctly that did not end on a line feed. Fixed. The shell bootstrap code was partially broken and could not run the "Initial CLI" correctly. The BCPL startup mechanism was rewritten completely (to the better). Incorporated all traditionally resident commands into the Shell-Seg making this a self-contained shell with a resident segment that is rom-able and can bootstrap the system. Rewrote the shell command line parser to some degree. This implies various changes on how the command line gets interpreted. Good news is that backticks can now also be used to specify the command itself, alias [] works within backticks, and backticks cooperate nicely with aliases in general. Furthermore, the new parser allows multiple, recursive, but non-looping alias expansion, and aliases containing backticks that are expanded correctly. - Fixed *>< redirection hits. Fixed generation of result codes, the shell forgot to forward command result codes properly. Fixed stderr redirection: stderr defaults to stdout, it now defaults to the shell output stream; hence, an explicit *>< is required for the old behaivour. - Fixed escaping for implicit commands CD,EXECUTE, and others: They no longer escape " and * if found in an unquoted string. Note that this is the proper behaivour, even though this is more a "feature" of ReadItem() than anything else. - Fixed the "CD" command: It did not allocate the anchor path from memory resulting in a possibly mis-aligned "FileInfoBlock" and damaged memory. Yikes! - Fixed the "resident" command: First of all, it also placed "AnchorPath"s on the stack, which is no good. Second, it did the printf for the resident command list within a loop while Forbid(), making the forbid for the list lock pretty much useless. - Reworked set,setenv,alias,unset,unsetenv,unalias: All of these six commands are handled by the same segment, but the division into various subcommands happened in a rather unorthogonal way by second-guessing from the command name. It is now organized in several segments calling the same main routine with parameters. "set" became reorganized a lot as well: "setenv" without parameters is no longer redirected to "list", making this independent of whether external commands are available. "set" reformats now ESC and CSI sequences on the screen consistently by using the BCPL escape character "*". Other non-printables are (as it always has been the case) replaced by the smear-character 0x7f (DEL). - Reworked get, getenv for the same reason: One segment, two commands. - Reworked "run", but not quite as much as I would like to. This still rolls its own faked input file handle. Even worse, it gets the command line from the undocumented internal buffer of its stdin stream. There's currently no better way of doing it. - Added a new option "HEAD" to "path". This will add new paths to the start of the command search path and will hence search them first. - Reworked "newshell". It no longer tries to place critical DOS structures on the stack, and will therefore long-word align them correctly all the time. The window open path of NewShell has been changed to CON://130/AmigaShell/CLOSE/SHELL to signal shell usage for console handlers, e.g. ViNCEd. - AGENDA: The shell argument parsing is still somewhat wierd. Backticks are not recognized as "quotes" and don't group commands on parsing - this happens only on expanding them. This is mainly the matter of ReadItem() which should be replaced by a custom routine. Further, single quotes are not handled at all. I wonder whether I should touch this or leave it as "compatibility feature". Changes for 45.2 (commit log unavailable) - Fixed several missing error reports, for example for out-of-memory situations and unability to open redirection files. - Changes the style of stderr redirection: Stderr defaults now to stdout, unless redirected otherwise. This is a compatibility cludge for <>NIL: type redirection. - Redirection with <> checks now explicitly whether the target file is interactive or NIL: It will fail in all other cases. - Redirection into "*" with the run-back operator "&" will now go into the console owner established for the command output rather than the current console. - Added PushCD, PopCD and SwapCD commands as build-ins. - Re-established the "oldredirect" variable. If set to "on", the shell will check for redirection operators only immediately behind the command name and nowhere else. This is a pre-V36 compatibility feature that was dropped in V40 due to limited ROM space. - Added SAVE keyword to UNSETENV to make the changes permanent. - Fixed wrong templates for unalias, unset and unsetenv. - Reworked ASK a lot; this command allows now numeric and string input, and places the result either on stdout or into a user specified local variable. Changes for 45.3 (commit log unavailable) - The "&" symbol was broken in several ways: First of all, it unlocked home and current directory twice instead of once, causing possible memory trashes. Further, it did not set CLI->cli_Module correctly which is required for some run-back and stay-resident programs. Thrid, it did not check the very same CLI variable to release the program again, hence might have even unloaded segments that are not meant to be unloaded. Fourth, it did not work well with "Execute" due to the rather clumpsy way the original BCPL shell introduced the execute logic. The "&" handling was more or less rewritten for the 45.3. The new logic introduced another kludge in the shell startup logic (oh no!) but makes it possible to run programs in background *without* destroying stdin, hence unlike run. Therefore "run" is more or less obsolete now. - The shell command line parser was turned upside down. Nothing of the old parser is left. The net effect is that the general logic of argument parsing has been improved much. The shell now knows on variable expansion and backtick expansion whether it inserts arguments into quotes, and if so, escapes properly. - Fixed handling of aliases in some ways, especially fixed a bug of the 45.2 where the shell forgot to insert a space. - Removed handling of ( and ) in pipes. They aren't used by any pipe command I know of and are therefore just here to make the syntax even more cludgy. - Fixed handling of interpreter setup by means of #! or ;!. The line behind the magic symbols is now parsed thru ReadItem and hence requires proper quoting, so beware! - Fixed handling of implicit commands on arguments starting with quotes. The old shell could not run these commands properly due to unadequate re-escaping of the command argument. This is now all handled (hopefully correctly) by one common routine that is also used for variable and backtick sub- stitution. Changes for 45.4 (commit log unavailable) - The 45.3 release caused problems with existing scripts because quoted variables within quotes where escaped by * such that double quotes resulted. While this is correct in principle, it broke already existing scripts. For this reason, a special rule is now applied: Variables within quotes get their first pair of surrounding quotes removed. You can avoid this by setting the variable "keepdoublequotes" to "on": - set keepdoublequotes on - Pre 45.3 releases generated a wrong error for script files that are read-protected. Fixed. Changes for 45.5: (commit log unavailable) - Fixed the parser state machine such that variables of wierd names like ">t" are possible. The parser used to be quite inconsistent how to handle them. - SwapCD has an optional LEVEL argument that defines which level of the directory stack to swap with. - The stack extension logic scans now the first 4K for the stack cookie. - Setenv SAVE clears now the "e" bit on the saved variables. - The asterisk in front of $, [ and ` is now handled correctly again. * escapes the following character, ** escapes the star from escaping, *** is a double star with escaped following control character. - Added the possibility to check for the existance of a variable by the $?varname method. $?a will expand to 1 if a is defined, 0 otherwise. $??a will expand to 1 only if a is found as a global variable. - Fixed handling of quotes in variables and backticks outside of quotes. Behaivour of the shell depends here now again on the "keepdoublequotes" variable. If "on", the quotes are escaped and the full string is put into quotes, otherwise the string is left alone. If already in quotes, "keepdoublequotes" = "on" escapes quotes within the variable body, otherwise the outermost quote gets removed. - Fixed the escaping of the rear backtick of a backtick sequence. - StdErr redirection to NIL: by *>NIL: will now clear the console task for the command to be run. - Command interpreters specified by the #! or ;! token may now get additional arguments specified on this line. The script file name is inserted between the command and these arguments. - Fixed the multiple redirection issue. Fixed handling of alias and redirection. As a side condition, the output of the "set" and "setenv" commands can now be redirected just fine. Changes for 45.6 (commit log unavailable) - Various minor code cleanup concerning the command buffers; they are now all static to the functions they belong to. - Fixed recognition of $VIEWER which had to be a local variable to be functional. - Removed beta warning message on startup. - The shell scans now all hunks of a loaded binary for the stack size. Furthermore, several enhanced safety checks have been added for this feature. - Added a german documentation, proof-read and spell-checked the english documentation. Changes for 45.7 (commit log unavailable) - The run-back operator & did not move the shell segment in the seg-array and hence might have crashed some BCPL commands. - The stack size search routine got improved quite a lot and is now much faster than before - by a factor of four to five. - The "setenv" command clears now the "e" bit of the variables it saves. - Added a Shell.guide (Thanks Martin for the help). Changes for 45.8 (commit log unavailable) - Fixed handling of backticks within comments. They are now properly ignored. - Fixed handling of equal-signs within arguments. They are now considered similar to blank spaces and consider following double-quotes as function, not as literal. Changes for 45.11 (commit log unavailable) - Fixed result code of PopCD. Fixed search path for external scripts with a non-native shell interpreter. Fixed the same problem for datatypes. The Shell will now use PROGDIR: correctly. Changes for 45.12 (commit log unavailable) - Fixed handling of alias expansion and backticks. In case a backtick expansion resulted in a string containing backticks, an alias would expand the second backtick pair again even though it shouldn't. - Changed handling of variable expansion once again. The shell used to expand variables after argument parsing; especially, if the command was given by a variable, blanks were considered parts of the command. This might possibly be desirable, but I changed it for backwards compatibility. Changes for 45.16 (commit log unavailable) - Fixed two bugs of alias handling: Alias expansion now also recursively expands backticks and shell variables in the alias body. - This version also provides a new feature of the shell, namely interactive debugging of shell scripts. To enable it, set the variable "interactive" to "on". The shell will then prompt every command it executes and waits for your response. The command can be run by pressing return, skipped by pressing DEL or the shell script can be aborted with ESC. This can be a useful tool for debugging the startup-sequence. Changes for 45.25 (commit log unavailable) - The alias arguments are now also valid within variable names and backticks. Furthermore, alias, variable and backtick expansion got rewritten, removing any circular dependencies, i.e. alias, backtick and [] expansion are now done in one single step. This has the side effect that backticks can not be used to expand to variable names (similar to the bash) and the keepdoublequotes variable also applies to the alias [] argument. It has another (positive) side-effect that no part of the command string is really parsed twice, thus avoiding trouble of backticks or variables that expand to another defined variable name by pure chance. - Another seemingly minor improvement is that recursive execution of script files finally works (for the first time ever), meaning that you can actually skip back in front of another EXECUTE command. To make this working, make sure that C:Execute is resident before the shell requiring this feature is started. This seemingly simple feature required major trickery in the shell and corrects at least one of the anoyances of the Amiga Shell. Changes for 45.28 (commit log unavailable) - The magic "hash-bang" sequence was partially broken and did not append additional command line arguments to the executing program correctly. This got fixed. Changes for 45.29 (commit log unavailable) - Previous versions did not update the CLI stacksize field when creating run-back processes with the "&" operator, even though the correct size of stack was allocated. Nevertheless, some programs rather checked cli_DefaultStack instead of the stack size they got, and reported a lack of stack. This version fixes this problem. Changes for 45.31 (commit log unavailable) - The 45.29 version did not correctly carry over the return code of a command executed in back-ticks to the main shell. This version now reports the original secondary return code of the sub-shell as error again, e.g. whenever you execute a command in back-ticks, and this command fails, the shell will print this failure as error code. -------------------- AmigaOS 3.1.4.(1) project ----------------------- Changes for 45.32 (18.12.2016) - This re-integrates the latest AmigaShell for the classics (V45.31) back into the AmigaOs sources. No functional changes. TODOs: - Should really include execute in the resident list as it requires proper handling of the execution/IO stack, which is currently not granted. Changes for 45.33 (20.12.2016) - As execute is all new now, the special hack that allowed recursive execution of scripts is no longer necessary and has been removed from the shell. Changes for 45.34 (20.12.2016) - Fixed a resource leak in recursive shell execution. Changes for 45.35 (21.12.2016) - Fixed another potential resource leak in out of memory situations. - Allows now also input/output redirection of the execute command by storing the shell streams on the execution stack as well. Changes for 45.36 (4.1.2017) - For some strange reason, even the original shell did not clean up a command file left behind from an execute called indirectly through a System() call. This is probably an oversight and not a design decision, so the shell cleans up in this case as well. Changes for 45.38 (10.2.2017) - In case a recursive shell script was launched through System() instead through the shell directly, the shell erraneously terminated the entire recursive call at the EOF of the deepest nested script. As a related bug, the "QUIT" command did not work properly for recursive scripts and terminated only the current script, but not the entire hierarchy as it should. Changes for 45.39 (29.9.2017) - The expansion of backticks caused an error in case the command in backticks did not generate any output. This problem was fixed. Changes for 46.1 (14.10.2017) - This release of the shell introduces native handling of pipes and concatenation operators, namely | and ||. Unlike former releases, there is no longer a need to use an external command for it. Also, a new resident command named '(' has been added. This command spawns a subshell of its contents, and for that reason, orders commands, pipes and concatenation operators. Changes for 46.2 (14.10.2017) - Fixed releasing the temporary pipes - forgot to clear the pointers. Changes for 46.3 (28.10.2017) - The bracket operator/command requires now a blank space behind it to be consistent with the closing bracket. This is also made consistent with the rest of the command line parsing. - Made IOstream lifetime handling much simpler. Changes for 46.4 (4.12.2017) - Removed special parsing rules for rx. Really need to fix the quoting rules for rx and adopt them to the Tripos (yuck!) rules. - Improved the insertion rules by properly adding quotes in case the contents contains a line feed or escape. Changes for 46.5 (5.12.2017) - This was still not quite consistent as it did not handle variables with blank spaces as contents correctly. They do not get quoted (as they should) but must be escaped if surrounded by quotes. - Variables within quotes are now expanded as binary variables, so line feeds then persist. Changes for 46.6 (15.12.2017) - Uses now the new "rx script" to disambiguate between commands and quoted file names. Changes for 46.7 (17.2.2018) - The shell removes now trailing blanks before pushing arguments into commands. This usually makes no difference, except if the arguments are parsed off by a /F template parameter. In specific, SET did strange and wonderful things in case the assigned value was not terminated. Changes for 46.8 (11.5.2018) - Fixed a hit in the resident command that attempted to use NULL as a pointer to the previous version of a resident command. Changes for 46.9 (8.9.2018) - Allowing binary vars in double quotes was probably not such a hot idea. Now binary vars can be explicitly requested by placing an exclamation mark in front of the variable, and also put them in quotes (as otherwise it really messes with the shell). Changes for 46.10 (12.9.2018) - The maximum size of variables is now 106 characters, which is the maximum size any filing system can support. Changes for 46.11 (5.10.2018) - The shell did not set the CLI standard input different from the process input in case of piping or in combination with runback operations triggered by "&". This broke sort and search in pipes, unless they were put in last position. Changes for 46.12 (28.10.2018) - Enlarged the maximal size of variables for get and getenv, and the maximal size of the path for the Path command. Changes for 46.13 (commit log unavailable) - Apparently, any error code passed over from command execution did not unwind to the top-level, which then (naturally) forgot to abort execution if the failat level told so. Changes for 46.14 (17.11.2018) - Installing a new shell on top of a ROM shell now also replaces the built-in commands instead of adding them twice to the resident list as before. - The shell required V40 of the dos.library and crashed if it was not available. It can now also do with V39, and will not crash - though the system will not boot either on versions below V39, how could it without a boot shell. Changes for 46.15 (18.12.2018) - Runback no longer attempts to open CONSOLE: if there is no console task. Instead, it falls back to NIL: now. Changes for 46.16 (17.1.2019) - The middle part of a multi-concatenation pipe would erraneously read to a non-existing buffer due to a non-initialized base register. Changes for 46.17 (24.3.2019) - BuildCLI() creates now all cli strings as vectors, just in case an old program expects them to be so. Changes for 46.18 (14.4.2019) - In case variable expansion failed, the shell failed to print an error and just aborted. - In case alias expansion failed, no error report was made whatsoever and processing erraneously just continued. - The parser state machine had still a bug in parsing double dollar signs incorrectly. Changes for 46.19 (19.4.2019) - The $? operator only checked for environment variables, but not for local variables. Fixed. - Input redirection via << did not work for some shell commands due to a mixup in the BCPL buffered IO. - The variable oldredirect no longer acts on pipes as it clearly makes no sense there. Changes for 46.20 (5.6.2019) - The parser had another bug parsing two variables following each other. Changes for 46.21 (11.6.2019) - Reworked the scanning algorithm for the stack cookie a bit. ------------------------- AmigaOS 3.2 project ------------------------ Changes for 47.1 (16.12.2018): - This is a new shell branch that features *TADA* tab expansion and history handing as part of the shell. It requires additional console support to receive TAB and the TAB input as CSI cmd;len;pos U sequences. Changes for 47.2 (25.12.2018): - The TAB expansion took the last character of a pattern as type indicator what to scan for, this idea did not work so great because this did not allow to scan into directories. - The TAB and history expander uses now ^X to erase the user input instead of ^B, the latter of which also reset the history and send another TAB request back to the shell. Changes for 47.3 (27.12.2018): - Added the variable "simpleshell" which can be set to "on" to disable the tab expansion and history functions. Note that you would typically not need this as the shell turns off tab expansion anyhow when executing scripts. Changes for 47.4 (31.12.2018): - Directories within the current directory now also match when scanning for commands. This allows to find commands from the current directory in other subdirectories using TAB-expansion. - The shell now clears the input buffer before sending a bell to the console, thus making the life of the con-handler easier, and also avoiding a conflict with ViNCEd. Changes for 47.5 (2.1.2019): - The check for Medium Mode is now more careful and does not repeat the same check twice on the same file handle. Changes for 47.6 (27.1.2019): - Added the "history" command to the shell built-in command list, and a communication protocol via pr_SegList[4] which contains, in a dummy segment, a pointer to the history - and probably other shell internals in the future. Ideally, struct CommandLineInterface should be extended, though this structure is documented and hence frozen. Changes for 47.7 (2.2.2019): - Hijacking pr_SegList[4] for extension did not feel right. So instead, it now extends the CommandLineInterface structure. Unfortunately, the shell has to create now its own structure for that. In long term, this might go into the dos.library. Changes for 47.8 (14.2.2019): - TAB-expansion an argument in the middle erroneously pulled in a blank from the command line, thus creating the wrong search pattern. This has been fixed. Changes for 47.9 (5.3.2019): - Some characters were not properly escaped before creating a pattern for scanning directories. In particular, brackets require escaping with backticks. Changes for 47.10 (24.3.2019): - BuildCLI() creates now all cli strings as vectors, just in case an old program expects them to be so. Changes for 47.11 (14.4.2019): - In case variable expansion failed, the shell failed to print an error and just aborted. - In case alias expansion failed, no error report was made whatsoever and processing erraneously just continued. - The parser state machine had still a bug in parsing double dollar signs incorrectly. Changes for 47.12 (19.4.2019): - The $? operator only checked for environment variables, but not for local variables. Fixed. - The && was parsed as an operator, even if contained in brackets or double quotes. - Input redirection via << did not work for some shell commands due to a mixup in the BCPL buffered IO. - The variable oldredirect no longer acts on pipes as it clearly makes no sense there. Changes for 47.13 (21.4.2019): - The why command no longer prints its output through PrintFault, such that redirecting StdErr only affects errors. Changes for 47.14 (5.6.2019): - The parsing of double dollar signs was still not quite correct, fixed that again. - In case two variables were placed near each other, the parser failed to detect the second variable because it parsed the second $ sign twice. This was fixed in the parser. - The stack cookie is now also accepted if it ends with a trailing \0 to be consistent with the workbench. - TAB expansion incorrectly failed to identify a variable expansion if the cursor was placed directly behind the $ sign. This also happened if the $ sign was the last character on the line. Changes for 47.15 (10.6.2019): - newshell requires now the v47 dos.library and hence shrunk a lot in size. Changes for 47.16 (11.6.2019): - Reworked the scanning algorithm for the stack cookie a bit. Changes for 47.17 (20.6.2019): - Reverted the return-from-startup code a bit as the modification, albeit correct in the real world, does not work properly with vamos. Changes for 47.18 (21.6.2019): - The shell runs now into an alert in case it receives obsolete startup calls. As the latest dos.library builds a longer CLI structure, it is no longer necessary to extend it for the history. Changes for 47.19 (5.8.2019): - The shell is now a bit more careful for checking whether its CLI structure is extended or not, and works around older versions of Arexx not building them properly. Changes for 47.20 (8.8.2019): - The runback token caused a muforce hit. Fixed. Aborting the TAB expansion by ^E did not always work, and had side-effects on the current console input. It now is a safe abort that leaves the user input intact. Changes for 47.21 (17.8.2019): - Argument substitution within execute did not escape $ and backtick characters that were taken from the expanded arguments. Variables that are part of a pattern but not part of the search path are now expanded prior passing the pattern to the searcher. Changes for 47.22 (21.8.2019): - The execution stack logic unfortunately made the redirection input the current input of the shell, though this broke execution through pipes. This was actually not necessary as Execute itself performs this step to let the shell execute its prepared file. Hence, this part of the logic is removed, though recursive execution is retained. - However, simply removing this logic had the side effect that scripts can no longer substitute commands, though they should. So, the execute input redirection rule remains in force if execute is "implicit" by the s bit. - Execute did not accept arguments if its input was redirected due to a buffer conflict. Changes for 47.23 (27.9.2019): - Added the "debug" variable that, if if set to "on", pushes executed commands through the serial output. - Alias argument substitution through [] stops now at all forms of pipes, and also at input or output redirection. Whether the latter is really the correct implementation is another question. Changes for 47.24 (23.10.2019): - The shell now escapes tokens of the pattern matcher in found file names with '. Changes for 47.25 (27.10.2019): - Instead of creating a new CLI, the shell history function errors in case the cli structure is unextended. Changes for 47.26 (13.11.2019): - Added keywords to load and save the history. - Modified the history functions to act a bit less weird. Changes for 47.27 (16.11.2019): - The shell no longer sends an ACTION_FORCE_INPUT to the con-handler with length 0 because this makes little sense. Changes for 47.28 (19.11.2019): - The shell keeps now track whether a TAB search pattern matches one or multiple files/directories, and only inserts closing quotes in case the match is complete. Changes for 47.29 (24.11.2019): - Fixed an off-by-one error in stacking the command file for recursive execution. - Added a function pointer to the extended CLI structure by which the dos.library can request TAB-expanded command line parameter substitution. - Extended Execute to make use of this parameter execution. - Added the DoShellMethod() function to request functionality from the shell such as to perform TAB expansion. Changes for 47.30 (1.12.2019): - Navigation through the history with the cursor keys (or whatever key the history is bound to) is now cyclic. Changes for 47.31 (1.12.2019): - The LIST method returns now the list of supported methods of the shell. - The automatic buffer extension of the line reader was a bit premature to extend the buffer, even if it is not needed. This caused the shell to waste a lot of memory in case a script is not terminated by a *N. Changes for 47.32 (unknown date): - In case the expansion is complete, TAB expansion is aborted and the next TAB triggers a new scan. Changes for 47.33 (22.12.2019): - As the dos.library functions SetVar() and DeleteVar() do most of the work anyhow, all the manual protection bit handling and saving to ENVARC: was removed from the set/setenv commands. - The Fault command prints the decoded faults now over COS, not CES. - The path command prints the "Current Directory" string now over COS, not CES. - The cd, popcd and swapcd command no longer accept soft links as targets. - popcd and swapcd were integrated into cd to save some ROM space. Changes for 47.34 (28.12.2019): - NewShell uses now the new SYS_InName tag to ensure that the target console window is opened by the shell itself. Changes for 47.35 (31.1.2020): - Added the shell variable HISTSKIPDUPS. If this variable is yes,on,TRUE or 1, then browsing through the history skips duplicate lines. Changes for 47.36 (13.2.2020): - Fixed some hits in the history. Changes for 47.37 (9.3.20) - Now skipping duplicate history lines is the default, and the shell variable NOLISTSKIPDUPS can be used if skipping is not wanted. Changes for 47.38 (19.4.20): - Change the tab expansion behavior into 2 distinct modes to be chosen via COMPLETION local shell variable - Also disable so it doesn't do split expansion on both left and right side of cursor Changes for 47.39 (21.4.20): - Ignore .info files during completion, unless it is the only match or unless NOINFOEXCEPTION is given in the COMPLETION shell variable - Don't list tab completions with full path names - When listing completions group files with .info into one item by appending " (+info)" - Fix a bug regarding protection bits for first argument completion - New option EARLYLISTING to allow listing of all matches on first TAB press - Fix the common expansion being calculated incorrectly at times - and also save some ROM space and speed it up a bit - Sorted tab expansion results - affects both the listing and cycle order. Changes for 47.40 (27.4.20): - Don't sound the bell unless there is no match at all. - Find .info file buddies amongst the matches by searching both forwards and backwards. - Changed name of the local shell variable which controls the tab expansion behaviour from COMPLETION to SHELLCOMPLETION. Changes for 47.41 (23.5.20): - Sort matches directly when adding - less computation and code needed. Changes for 47.42 (07.9.20): - The history is no longer cyclic Changes for 47.43 (6.11.2020) - The built-in "Why" command now prints "Last command failed because: " again, instead of ": Last command failed because". Changes for 47.44 (29.11.2020) - Now the command line contents will not be cleared when a running tab completion is aborted. Changes for 47.45 (02.12.2020) - Squeeze some code together so we don't send ACTION_FORCE more than once unless it is a "clear" - Fix Tab completion getting fooled by quotes Changes for 47.46 (06.12.2020) - Small optimizations - Make it possible to break during printing of alternatives - More completion fine tuning, related to completing the not-last-argument - The tab completion of quotes had the nasty side effect it caused full expansion of arguments - Do not match non-executable files in current dir when tab completing the first argument - Improve tab completion performance by not adding candidates from C: twice if it is present in the path (which it generally always is) - More than doubled tab candidate list scrolling speed on A3000 class machine. Changes for 47.47 (23.02.2021) - Rename NOINFOEXCEPTION to ICONSASFILES