A custom POSIX-style shell implementation in Java, built from scratch.
Builtins Β· I/O redirection Β· pipelines Β· job control Β· history Β· variable expansion Β· aliases Β· tab completion
Features Β· Requirements Β· Building Β· Usage Β· Architecture Β· Testing Β· Releases Β· License
A custom POSIX-style shell implementation in Java, built from scratch with support for builtin commands, I/O redirection, pipelines, tab completion, job control, command history, variable expansion, and aliases.
| Command | Description |
|---|---|
echo |
Print arguments to stdout |
pwd |
Print current working directory |
cd |
Change directory |
ls |
List directory contents |
mkdir |
Create directories |
rmdir |
Remove empty directories |
touch |
Create files or update timestamps |
cat |
Display file contents or read from stdin |
type |
Identify command type (builtin or PATH executable) |
exit |
Exit the shell |
history |
Display command history |
fc |
List or rerun history entries |
clear |
Clear the terminal screen |
alias |
Set or list command aliases |
unalias |
Remove aliases |
declare |
Set or list variables |
export |
Export variables to environment |
unset |
Remove variables |
jobs |
List background jobs |
complete |
Register custom tab completion scripts |
- I/O Redirection β
>,>>,2>,2>> - Pipelines β
cmd1 | cmd2 | cmd3 - Background execution β
command & - Variable expansion β
$VAR,${VAR},$?,$$,$! - Variable assignment β
VAR=value - History expansion β
!!,!n,!prefix - Tab completion β builtins, PATH executables, files, directories, aliases
- Command history β persistent via
~/.shell_java_history - Aliases β recursive expansion with self-reference protection
- Quote handling β single quotes, double quotes, backslash escaping
| Variable | Description |
|---|---|
HISTFILE |
Custom history file path (default: ~/.shell_java_history) |
HISTSIZE |
Maximum number of history entries (default: 1000) |
HISTCONTROL |
History filtering: ignoredups, ignorespace, erasedups, ignoreboth |
PATH |
Directories to search for executables |
PATHEXT |
Executable extensions on Windows (e.g. .exe;.bat;.cmd) |
- Java 17+
- Maven 3.6+
mvn packageThis produces target/shell-java-<version>.jar.
java -jar target/shell-java-1.0.0.jar# Basic commands
$ echo "hello world"
hello world
$ ls
src target pom.xml
# I/O redirection
$ echo hello > out.txt
$ cat out.txt
hello
$ echo world >> out.txt
$ cat out.txt
hello
world
# Pipelines
$ echo hello world | cat
hello world
# Variable expansion
$ NAME=world
$ echo "hello $NAME"
hello world
$ echo $?
0
# Background jobs
$ ping -n 10 127.0.0.1 &
[1] 12345
$ jobs
[1]+ Running ping -n 10 127.0.0.1 &
# Aliases
$ alias ll='ls'
$ ll
src target pom.xml
# History
$ history
1 echo hello
2 ls
3 history
$ !!
historysrc/main/java/
βββ Main.java
βββ Shell.java
βββ alias/
β βββ AliasManager.java
βββ command/
β βββ CommandRegistry.java
β βββ Executable.java
β βββ ExternalCommand.java
β βββ ProcessBuilderFactory.java
β βββ builtin/
β βββ Builtin.java
β βββ BuiltinFactory.java
β βββ AliasBuiltin.java
β βββ CatBuiltin.java
β βββ CdBuiltin.java
β βββ ClearBuiltin.java
β βββ CompleteBuiltin.java
β βββ DeclareBuiltin.java
β βββ EchoBuiltin.java
β βββ ExitBuiltin.java
β βββ ExportBuiltin.java
β βββ FcBuiltin.java
β βββ HistoryBuiltin.java
β βββ JobsBuiltin.java
β βββ LsBuiltin.java
β βββ MkdirBuiltin.java
β βββ PwdBuiltin.java
β βββ RmdirBuiltin.java
β βββ TouchBuiltin.java
β βββ TypeBuiltin.java
β βββ UnaliasBuiltin.java
β βββ UnsetBuiltin.java
βββ completer/
β βββ CandidateCollector.java
β βββ SystemBinaryCompleter.java
βββ history/
β βββ HistoryManager.java
βββ jobs/
β βββ Job.java
β βββ JobManager.java
β βββ JobStatus.java
βββ pipe/
β βββ Pipeline.java
β βββ PipelineResult.java
βββ redirect/
β βββ OutputWriter.java
β βββ Redirect.java
β βββ RedirectType.java
βββ util/
βββ Environment.java
βββ ParseResult.java
βββ PathResolver.java
βββ Tokenizer.java
βββ UnterminatedQuoteException.java
mvn testUnit tests cover:
Tokenizerβ quoting, escaping, pipes, variable expansion, redirectsPathResolverβ PATH scanning, PATHEXT extension matchingHistoryManagerβ HISTSIZE, HISTCONTROL, persistenceJobManagerβ job tracking, reaping, numberingAliasManagerβ expansion, recursion, self-reference protectionEnvironmentβ variable management, exit codesOutputWriterβ stdout, file, append, stderr redirectionCommandRegistryβ builtin registration and lookup
| Version | Features |
|---|---|
v0.1.0 |
REPL, basic builtins (exit, echo, pwd, cd, type) |
v0.2.0 |
File operations (ls, mkdir, rmdir, touch, cat), quoting |
v0.3.0 |
I/O redirection (>, >>, 2>, 2>>) |
v0.4.0 |
Tab completion with JLine3, complete builtin |
v0.5.0 |
Job control (&, jobs) |
v0.6.0 |
Command history (history, fc, clear, HISTFILE, HISTSIZE, HISTCONTROL) |
v0.7.0 |
Pipes (|), variable expansion ($VAR, $?, $$, $!), declare/export/unset |
v1.0.0 |
Aliases (alias/unalias), unit tests |
MIT β see LICENSE for details.