Objective
This guide walks you through creating Mini-Shell, a Unix-like shell in Rust, covering command execution, piping, I/O redirection, built-in commands, background processes, and signal handling.
Step 1: Environment Setup
- Install Rust using
rustup
. - Initialize the project with
cargo new mini-shell
. - Include dependencies in
Cargo.toml
.
Suggested File Structure
mini-shell/
├── src/
│ ├── main.rs
│ ├── parser.rs
│ ├── executor.rs
│ └── utils.rs
├── tests/
├── Cargo.toml
└── README.md
Step 2: Implementing the Shell Loop
- Create a loop to display a prompt, read input, and handle the
exit
command.
Step 3: Executing External Commands
- Parse input commands into arguments.
- Implement process creation using
fork()
. - Execute commands with
execvp()
and wait for completion usingwaitpid()
.
Step 4: Built-in Commands (cd
, exit
)
- Handle
cd
usingchdir()
. - Implement
exit
with process termination.
Step 5: I/O Redirection (<
, >
)
- Parse and handle input/output redirection.
- Use
open()
anddup2()
for file operations.
Step 6: Command Piping (|
)
- Implement pipelines using
pipe()
,fork()
, anddup2()
. - Ensure correct redirection of input and output streams between commands.
Step 7: Background Execution (&
)
- Support commands running in the background by detecting trailing
&
.
Step 8: Signal Handling
- Capture and handle signals such as Ctrl+C and Ctrl+D gracefully.
Step 9: Testing and Automation
- Write shell scripts in the
tests/
directory to automate verification of shell behavior.
References
For complete code examples, detailed explanations, and full instructions, visit the original instructions document.