Create your own shell using node js
Here’s a step-by-step guide to build a Node.js-based bash script for production and package it as a standalone executable:
Step 1: Set Up the Project
- Create a New Directory:
bash Copy code mkdir node-bash cd node-bash
- Initialize a Node.js Project:
bash Copy code npm init -y
- This creates a package.json file with default values.
Step 2: Write the Script
- Create a file named node-bash.js in the project directory:
bash Copy code touch node-bash.js
- Add the following code to node-bash.js:
javascript Copy code #!/usr/bin/env node const readline = require("readline"); const { exec } = require("child_process"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, prompt: "node-bash> ", }); console.log("Welcome to Node.js Bash! Type 'exit' to quit.\n"); rl.prompt(); rl.on("line", (line) => { const command = line.trim(); if (command === "exit") { console.log("Exiting Node.js Bash. Goodbye!"); rl.close(); return; } exec(command, (err, stdout, stderr) => { if (err) { console.error(`Error: ${err.message}`); } else { if (stdout) console.log(stdout); if (stderr) console.error(stderr); } rl.prompt(); }); }); rl.on("close", () => { console.log("Shell session closed."); process.exit(0); });
- Add execute permission to the file:
bash Copy code chmod +x node-bash.js
Step 3: Configure package.json
- Open package.json and update it to include a bin field:
json Copy code { "name": "node-bash", "version": "1.0.0", "description": "A simple Node.js-based bash shell", "main": "node-bash.js", "bin": { "node-bash": "./node-bash.js" }, "author": "Your Name", "license": "MIT", "dependencies": {} }
- Install dependencies:
bash Copy code npm install readline
Step 4: Link the Script Locally
- Link the package globally for testing:
bash Copy code npm link
- Run the script using the node-bash command:
bash Copy code node-bash
You should see the interactive bash shell prompt:
plaintext Copy code Welcome to Node.js Bash! Type 'exit' to quit. node-bash>
Step 5: Package as a Standalone Executable
- Install pkg globally:
bash Copy code npm install -g pkg
- Update package.json to specify pkg targets:
json Copy code { "pkg": { "scripts": "node-bash.js", "targets": ["node16-linux-x64", "node16-macos-x64", "node16-win-x64"] } }
- Run pkg to create executables:
bash Copy code pkg .
This will generate binaries for Linux, macOS, and Windows in the current directory. Files will be named something like:
- node-bash-linux
- node-bash-macos
- node-bash-win.exe
Step 6: Test the Executable
- Test the executable on your platform:
bash Copy code ./node-bash-linux # Linux ./node-bash-macos # macOS ./node-bash-win.exe # Windows
- Confirm it behaves like the original script.
Step 7: Distribute Your Script
- Prepare Documentation: Add a README.md file explaining usage.
- Share Executables: Distribute the binaries for different platforms.
Optional Enhancements
- Add support for environment variables.
- Include custom commands or scripts.
- Handle complex shell features like piping (|) or chaining (&&, ||).