The problem with nushell is that everybody else uses bash.
I use nushell every day. Structured data, type safety, beautiful pipelines —
it’s the best shell I’ve ever used. But the rest of the world doesn’t care. When
I’m reading a README, it gives me bash commands to copy-paste. When I ask an AI
agent for help, it gives me bash commands to copy-paste. export API_KEY=sk-123 && curl -X POST ... — none of that works in nushell.
This happens constantly. Every tutorial, every Stack Overflow answer, every AI agent — they all speak bash. And nushell doesn’t understand a word of it. I either manually translate every command, or I open a second terminal just to run bash. Both options are terrible.
So I built Shannon.
Shannon is nushell with one addition: press Shift+Tab and you’re in bash. Press Shift+Tab again and you’re back in nushell. That’s it.
[nu] ~/project > $env.HOME
/Users/ryan
[nu] ~/project > <Shift+Tab>
[bash] ~/project > export API_KEY="sk-1234"
[bash] ~/project > echo $API_KEY
sk-1234
[bash] ~/project > <Shift+Tab>
[nu] ~/project > $env.API_KEY
sk-1234
Environment variables carry over both ways. Working directory carries over both ways. You switch modes and everything is just there.
This means when documentation says “add this to your .bashrc,” you can follow
those instructions directly in Shannon’s env.sh config file. When an AI agent
gives you a bash one-liner, you Shift+Tab, paste it, Shift+Tab back, and keep
working in nushell with the results.
Shannon doesn’t shell out to bash. It doesn’t spawn a subprocess. It embeds an entire bash interpreter — the brush crate — directly in the same process as nushell.
Shannon IS nushell. It copies nushell’s binary source code and adds a mode dispatch layer. When you’re in nushell mode, commands go through nushell’s parser and evaluator exactly like normal. When you’re in bash mode, commands route to brush instead. You get every nushell feature for free: completions, hooks, plugins, job control, history — all of it.
The boundary between the two shells is strings. Nushell stores some environment
variables as typed values — PATH is a list, not a colon-separated string.
When you switch to bash, Shannon converts typed values to strings using
nushell’s ENV_CONVERSIONS. When you switch back, nushell automatically
converts the strings back to typed values. You never think about this. It just
works.
Each mode gets its own syntax highlighting. Nushell mode uses nushell’s native highlighter. Bash mode uses tree-sitter-bash with a Tokyo Night color scheme. The highlighter switches instantly when you press Shift+Tab.
The most common interaction I have with AI tools involves copy-pasting shell commands. Claude gives me a bash command. ChatGPT gives me a bash command. GitHub Copilot gives me a bash command. Every AI agent in the world outputs bash.
Before Shannon, I had two choices: manually translate every command to nushell syntax, or give up and use bash. Neither is acceptable. I want nushell’s structured data and type safety for my own work, and I want to paste bash commands without friction.
Shannon makes both possible in the same terminal session. Shift+Tab into bash, paste the command, Shift+Tab back to nushell. The environment carries over. No context switching, no second terminal, no translation.
Shannon’s config also solves the setup problem. The env.sh file is a plain
bash script that runs at startup:
# ~/.config/shannon/env.sh
eval "$(/opt/homebrew/bin/brew shellenv)"
export PATH="$PATH:$HOME/.cargo/bin"
export EDITOR="nvim"
export ANTHROPIC_API_KEY="sk-ant-..."
Every tool that says “add this to your .bashrc” — homebrew, rustup, nvm,
pyenv — works in env.sh with zero translation. The resulting environment
variables are injected into nushell automatically.
Install from crates.io:
cargo install shannonshell
Create your environment file:
mkdir -p ~/.config/shannon
cat > ~/.config/shannon/env.sh << 'EOF'
export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$HOME/.cargo/bin"
EOF
Run it:
shannon
You’ll see the nushell welcome banner. Press Shift+Tab to switch to bash. Press Shift+Tab to switch back. That’s all there is to it.
Exported environment variables and the working directory carry over between
modes. If you export FOO=bar in bash, $env.FOO is bar in nushell. If you
cd /tmp in bash, you’re in /tmp when you switch to nushell.
What doesn’t carry over: nushell variables (let x = 5) and bash local
variables. Only exported environment variables cross the boundary. This is by
design — the two shells have fundamentally different type systems, and strings
are the honest, reliable interface between them.
Shannon is named after Claude Shannon, the father of information theory. He figured out that all information — text, images, sound — can be reduced to bits. Shannon (the shell) applies a similar insight: all shell state can be reduced to strings at the boundary, letting two very different shells share a single environment.
The project is open source under the MIT license. You can find it on GitHub and at shannonshell.com.