Crate oursh[−][src]
Expand description
This shell should be both POSIX compatible and yet modern and exciting. Fancy features should not be prevented by POSIX compatibility. This will effect the design of the shell.
The name of the shell is oursh
which is both somewhat unique, and
memorable. It’s also a nice name to play with pseudo-satirical themes…
right comrade? It’s short (ish) and sneakily fits rs
in it, which is the
extension of Rust programs, the language this will be written in.
Features
-
POSIX compatibility
-
Simple commands
ls
-
Quotes
echo "foo"; echo 'bar'
-
Assignment
LOG=trace cargo run
-
Variables
echo $foo
-
Special variables
echo $?; echo $1
-
Boolean status syntax
! true && false || true
-
Conditionals
if ; then ; elif ; then ; else ; fi
-
Compound commands
{ ls; date; }
-
Subshells
(sleep 1; date)
-
Background jobs
{ sleep 1; date; }& date
-
Redirection
date > now.txt
-
Pipes
ls | wc -l
-
Simple commands
-
Shebang block programs
-
Alternate syntax
{# ...}
-
Hashlang syntax
{#lang; ...}
, i.e.{#posix ls}
-
Shebang syntax
{#!/usr/bin/env ruby; puts :sym}
-
Alternate syntax
-
bash/zsh autocomplete compatibility
- Command completion
- Path completion
- Variable completion
- Job completion
- Syntax completion
-
man
/-h
/--help
parsing
- Multi-line input
-
Modern scripting language
- Macros
- Types
- Higher-order functions
- Threading?
-
Obfuscated strings (
!'password'!
) - mosh like remote session support
- Smart history, sync’d across devices
- Pipe old commands without rerunning
- Package manager
- Sane defaults
- Fast
POSIX Reference
See the following sections for building the POSIX sh
compliant program
language, and interactive terminal based REPL. While this mainly defines the
posix
module, there are a lot of common concepts to all
shells here.
- 3§2 Shell Command Language
- 10.2 Shell Grammar Rules
- 2§2.5 Standard I/O Streams
- 3§1.6 Built-In Utilities
- 3§1.4 Utility Description Defaults
- 2§2.3 Error Numbers
- 1§11 General Terminal Interface
- 2§2.4 Signal Concepts
Implementation
This shell will be written in Rust with minimal dependencies. Notably
termios
and libc
will likely be used. The parsing library will be
lalrpop
, which should support the syntax we want somewhat easily, though
grammar’s in general can be a tricky beast.
We will want to create a few internal modules for the shell.
This design is subject to change.
process
- sub-process execution management.program
- parser and interpreter for the syntax of the shell.posix
- POSIX (sh
-like) syntax.modern
- Modified syntax for supporting “modern” features, like lambdas.
repl
- syntax aware, read eval print loop for an underlying terminal.history
- records previous execution to a shared DB.completion
- searches for autocompletions based on partial syntax.bash
- bash completion support.zsh
- zsh completion support.parse
- dynamic completion generation, fromman
for example.
sync
- remote session and DB synchronization.
invocation
- loading for.ourshrc
and others.package
- simplistic package manager support (builtin function).
Modules
WTF!
Subprocess execution management.
Parsing and handling program syntax(es) of the shell.
Macros
Print debug information to stderr.