Philosophy
Core Values
Rsh's core value is that working in a shell should be fun. To support this, we believe that:
- A modern shell should be designed for usability and ergonomics. Above all else, Rsh should be fun to use.
- It should provide great informative errors messages when a command will not succeed correctly. This is critically important. A fun shell gives clear, actionable errors.
- It should be built around supporting casual use, as this is the majority of use in a shell, even by experienced users. Building a shell that is fun for casual use makes a fun shell for everyone.
- Rsh supports experimentation and growing ideas from experiments to programs. The ability to evolve ideas to one-liners, scripts, and then to programs is a key role a shell plays. To support this, Rsh builds on the idea of composable commands that work on a shared set of data types.
Non-goals
- Optimal performance. While we care about performance, the focus on performance should be in service of making Rsh more usable and enjoyable to use. Best performance on micro-benchmarks is a non-goal.
- Strictness. We want to help users write good scripts, but we should focus on helping them write correct scripts with good errors and good documentation.
- POSIX-compliance. Rsh intentionally optimizes for a pleasant experience over matching how commandline programs work in a POSIX-compliant way. It's important to be able to interop between Rsh commands and external commands, but maintaining strict compatibility is a non-goal.
- Paradigm adherence. Rsh looks at the shell space flexibly, and borrows good ideas where possible from functional programming, systems programming, OOP, and more. Following any particular paradigm rigidly does not serve the goals of the Rsh project.
Basic Design
The core of the Rsh design is the data model. Commands largely follow in service of making it easy to create data, to work with data, and to view data. One of the visible pieces of this work is the pipeline, which borrows heavily from the original Unix ideas of connecting simple programs together into more complex commands. Rsh takes this Unix philosophy and extends it from only strings to the wider data set that is more common in modern programming languages.