Wsh-Shell
Wsh-Shell is a lightweight, portable, and fully static shell interpreter written in C, designed for embedded systems. It requires no dynamic memory allocation and is built to run in constrained environments like microcontrollers, either bare-metal or under RTOS (e.g., FreeRTOS).
π Features
- Cross-platform, Highly Portable β only one header file to include
- Modular Design β ability to disable submodules for memory footprint optimization
- Single State Structure β all shell state contained in a single
WshShell_tinstance - Static Memory Only β no
malloc, no heap; all buffers are statically allocated - Command-line Editing β supports cursor movement, character deletion, and insert mode
- Command Parsing & Options:
- Supports short (
-h) and long (--help) flags - Supports int, float, string and other option types
- Supports double-quoted strings
- Supports short (
- Multi-User Support β multiple users, groups, access rights, and more
- Group-based Access Control β each command belongs to one or more logical groups; users are granted access only if their group set intersects with the commandβs group set
- Fine-grained Option Access Rights β every command option (-f, --reset, etc.) has an associated access flag (read, write, execute, admin); the shell enforces these permissions at runtime and reports mismatches
- Escape Sequence Handling:
- Parses VT100/ANSI sequences
- Supports arrow keys, delete, backspace, sound alerts, etc.
- Handles key combinations (Ctrl+C, Ctrl+D, etc.)
- Command History:
- Implemented as a circular buffer
- Efficient with hash-based integrity checks
- Navigable with arrow keys (β, β)
- Autocomplete:
- Tab / double-Tab completion for commands and flags
- Interactive Command Mode β commands can take exclusive control over user input, temporarily suspending the shell and routing all data to a single handler
- Customizable PS1 Prompt β user-defined templates for prompt appearance
- Await Prompt β await for a specific key press
- Different New Line Support - handle different terminals setup (
\r,\nor\r\n) - Passwords Stored Salted & Hashed β passwords are supplied and verified through a user-provided callback and always stored in a salted, hashed form; by default the module uses a lightweight Jenkins (non-cryptographic) hash, and no plaintext passwords are written to flash unless the integrator explicitly chooses to do so
- Command Option Validation β during command registration, the shell automatically checks for duplicate short or long option flags within the same command and triggers an ASSERT if duplicates are detected
π Python adapter
Repository also includes a Python adapter for connecting to wsh-shell, running commands, and parsing responses from a host machine.
πΎ Demo

πΎ Memory footprint
- Build options: cortex-m7,
-O1optimization - sizeof(WshShell_t) = 404 bytes
| Config | FLASH, KB | Comment |
|---|---|---|
| All features disabled | 4.06836 | |
+WSH_SHELL_PRINT_SYS/INFO/WARN/ERR |
4.58008 | Not recommended to disable shell messages |
+WSH_SHELL_INTERACTIVE_MODE |
4.68164 | |
+WSH_SHELL_HISTORY |
5.63867 | |
+WSH_SHELL_AUTOCOMPLETE |
6.19727 | |
+WSH_SHELL_PS1_CUSTOM |
6.66992 | |
+WSH_SHELL_PROMPT_WAIT |
6.78516 | |
+WSH_SHELL_DEF_COMMAND |
8.44922 | |
+WSH_SHELL_PRINT_OPT_HELP |
8.44922 | Could be useful on huge amount of external commands |
+WSH_SHELL_CMD_PRINT_OPT_OVERVIEW |
8.69922 | Could be useful on huge amount of external commands |
β¨οΈ Code counting
π¨βπ» Authors
- abalyberdin@whoosh.bike β initial MVP
- vignatov@whoosh.bike β improvements, refactoring
- akrestinin@whoosh.bike β project separation (for submodule usage), main structure, PC/MCU examples
- sshilin@whoosh.bike β UX improvements, extra features, documentation, public release
- eshamaev@whoosh.bike β CI/CD, docs deployment, high-level PC command app
βοΈ License
This project is licensed under the MIT License.
You are free to use, modify, and distribute this software in both commercial and non-commercial projects, provided that the original copyright notice and this permission notice are included.
