rwsh - Reinventing the Wheel Shell Code
Status: Pre-Alpha
Brought to you by:
snewbold
rwsh is a shell for Unix-like systems. Documentation can be found in the docs directory. As it is still very much of a proof-of-concept, there is no install or configure script. It is not intended to be compatible with existing shells, or even to keep their basic semantics. So please read at least the "introduction and philosophy" document before assuming that you know what a command will do. For example, rm without arguments may delete files (personally, I use rm without arguments more often than with them). Several changes are coming shortly, which may easily break scripts designed for this version of the shell, including the following. * .while will respond to the .retest_condition exception by testing the condition, and ending the loop if it fails, but (unlike .continue) continuing with the following statement if it succeeds. * Control flow statements such as .for will also use a prototype for the values passed to the argfunction rather than $1. * Functions will be able to take more than one argfunction with string arguments being associated with each argfunction. For instance this will permit .scope to take several prototypes with an argfunction for each prototype, and will run the argfunction for which its arguments match the corresponding prototype. * "Soons" will be replaced with "Earlies". The syntax will not (necessarily) change, but the meaning will. Rather than & meaning to evaluate the first time a containing statement is evaluated and && meaning to evaluate the second time a containing statement is evaluated, & will mean to evaluate at the beginning of the innermost block, and && will mean to evaluate at the beginning of the second most inner block. The result will be that wrapping a set of statements in a .scope or .collect_errors_* will not require changing the number of ampersands, and that the statement ".set FOO &FOO" will have the effect of restoring the value that $FOO had at the beginning of the block. * Global variables will be replaced by a heirarchical set of scopes. Functions will be declared to place their variables as a child of the current scope (leaving none of the current variables immediately accessible and combining all of its variables into a single value for the current scope), or within the current scope (making all of the current variables available and making the function's variables part of the same map), or to attempt to do one of those two in the parent scope. If there is no parent scope then a .no_more_turtles exception will be thrown. * Another use of the multiple argfunctions per statement will be the .select_all and .select_last builtins. They will run each of their argument functions in parallel, rotating between them when they input or output or request to cooperate with peers. .select_all will run until all argument functions complete, while .select_last will run until the last argument function specified completes, sending a sigpipe to any other argfunctions currently running. * Variables and functions will likely share the same namespace, and using a function as if it was a variable will be equivalent to calling it without arguments. Running .set on such a function will call it with the arguments, but will throw an exception if it terminates without having the effect of setting the specified value (or throwing an exception of its own). * Redirections will be handled by internal functions, so that the effect of >foo, or <bar<baz will be something that can change depending upon the configuration. * When handling a set of arguments as a whole, rather than as a set of words, any excess space that was included when specifying them will be included. * .stepwise will step through the argument specifications as well as through the statements of a function, permitting one, for example, to identify the arguments that make use of a particular variable. * Exception call stacks will include all of the arguments for each function at each level of the call stack rather than just the executable names. * .run_logic will be replaced by a system that treats .shell as a service which includes the request for user input, and which restarts after each command. As with .function_not_found, a missing implementation will be replaced with a simple implementation. * a "/" will be used to define a heirarchy amongst executables and variables. $foo/bar cannot be defined without defining $foo, and it will return the portion of $foo that immediately follows "bar=". Running "foo bar" will run the function that was named "foo/bar". * Currently, $foo$3 returns the third word of the variable foo. This will be replaced with a system of filters, which can be used to select members of a structure without being limited to whitespace-delimited structures, as well as being able to optionally handle variables that are not defined. * There will be "default redirections", so that interactive commands will not necessarily have either their input or output connected to the terminal. The builtin .is_default_input should be used to determine whether a command is receiving its input effectively from the user, and .is_default_output should be used to determine whether output is intended to be printed on the terminal. Other large changes are likely. To illustrate, before version 0.3, ERRNO was a special variable, that would prevent the execution of control flow statements such as .if and .while. Experience working with this setup convinced me that the problem I was aiming at was worth taking on, but that my first solution was actually an enormous pain most of the times it came up. I could very easily come to the same conclusion about some other feature that I have already implemented or will soon implement.