SHELL DESIGN NOTES ------------------ The shell has few bells and whistles. It allows up to 128 backgrounded jobs (after this point you have to wait for some to exit, because the table it uses to track these cannot be resized.) The background jobs are tracked in an array of MAXBG pid_t's. If an open slot is found, a background job's pid can be stashed there. Background jobs can be collected using the "wait" built-in command, which removes any pids whose exit status it collects from the background jobs table. The wait built-in command takes an optional argument, the process id to wait for. The shell will attempt to wait for any process, not just the ones it actually started as its own background jobs. However, since no facility exists for looking up the pids of running processes, this ability is not necessarily useful. If no argument is provided, wait waits for all outstanding background jobs. The shell uses WNOHANG if WNOHANG is defined, in which case background jobs are polled after every command, like in Unix shells. If WNOHANG is not defined, background jobs are polled only by user request. In OS/161 2.0, WNOHANG is always defined in the kernel header files, but the implementation is only suggested, not required. To make the shell stop trying to use WNOHANG, patch it, or remove WNOHANG from kern/wait.h. There are two other built-in commands: chdir, which uses the chdir system call to change directory, and can also be accessed as just cd, and exit, which causes the shell to exit with a specified exit status (0 if not supplied). Note that all these built-in commands must be built into the shell in order to work usefully. The shell processes commands by reading lines and then splitting them up into words using whitespace characters (space, tab, carriage return, and newline) as separators. No punctuation characters are interpreted, except for `&'. No variable substitution or argument wildcard expansion ("globbing") is performed. The `&' character, if present as the last word on a command line, is treated as the "background" operator: the command is run as a background job, that is, after starting it the shell immediately prints another prompt and accepts more commands. Note that the `&' must be preceded by whitespace to be recognized. The process id of the background job is printed as it starts. Note that shell builtins cannot be backgrounded; furthermore, because the OS/161 console does not support job control, starting background jobs that perform terminal input (or, to a lesser extent, terminal output) may produce confusing and/or unwanted results. The shell also supports the "sh -c COMMAND" syntax in the hopes that it will be useful.