mrkeyoor.com_
Fri 16 Oct 18:53 UTC
Dev Toolsevaluationupdated 14 Oct 2026

fish-shell review

Fish is a command-line shell that suggests commands as you type and supplies useful tab completions without a plugin setup. It helps people who want a friendlier daily terminal and are willing to learn its own shell language.

+11stars / 7d
Verdict

Our fish run installed 35 packages in 11 seconds, but pytest collected 0 tests and exited 5, leaving the shell's behavior unverified. Fish is worth a packaged trial if built-in suggestions and completion matter more to you than keeping Bash syntax unchanged. Keep your current login shell until your copied commands, keyboard layout, and clipboard workflow work in fish.

We ran it

Lab card: what happened when we ran fish-shellScreenshot of fish-shell (fishshell.com)
Install✓ · 11s35 packages · 38 MB
Build✓ · 0s
Tests✗ · 1s0 passed · 0 failed of 0 (pytest)
Known vulns0(pip-audit)
Repo2242 files~116,922 lines of source · 26.4 MB · 8 CI workflows · tests dir

Answers from our run

Does fish-shell build from source?

Dependencies installed in 11 seconds (35 packages), and the build succeeded in 0s. We cloned commit 35c2902 into a clean Debian container with 3 CPUs and no project-specific setup.

Do fish-shell's tests pass?

Yes: 0 of 0 passed when we ran the project's own test command (pytest). Some failures need services or credentials a bare container does not have.

Does fish-shell have known vulnerabilities in its dependencies?

pip-audit found none in the dependency tree at the time of our run.

Who should not use fish-shell?

Developers who need POSIX shell syntax unchanged: fish explicitly rejects POSIX compatibility.

What are the alternatives to fish-shell?

Zsh, Nushell, Elvish. Our fish run installed 35 packages in 11 seconds, but pytest collected 0 tests and exited 5, leaving the shell's behavior unverified.

Setup4/5Packages are recommended; our Python run did not validate the native build
Docs5/5Tutorial and Bash migration guide explain concrete syntax differences
Community5/5October 13 push and October 12 issue and PR activity
Maturity4/5Active maintenance and keyboard fixes; our run verified no shell behavior

Discussed on

  1. hnFish shell 3.0506 points
  2. hnThe fish shell is amazing447 points
  3. hnRewrite it in Rust375 points
  4. hnFish – Update on the Rust port335 points
  5. hnFish 4312 points

Who it’s for

Developers who want history suggestions and tab completion without assembling plugins.
Linux and macOS users willing to translate their shell configuration into fish syntax.
People who keep automation under its declared interpreter and want fish for interactive work.
Contributors prepared to follow the documented Rust/CMake route beyond our Python harness results.

Who it’s NOT for

Developers who need POSIX shell syntax unchanged: fish explicitly rejects POSIX compatibility.
Teams that paste Bash heredocs or [[ conditionals into the current shell: the migration guide documents both as unsupported syntax.
Windows users requiring a shell without WSL, Cygwin, or MSYS2: those are the README's Windows routes.
Users whose clipboard workflow must work on a minimal host without extra utilities: the README requires platform clipboard programs.
Release evaluators who require verified native behavior before adoption: our pytest command collected 0 tests and exited 5.

Setup reality

Our sandbox run at commit 35c2902 installed 35 packages in 11 seconds, occupying 38 MB. The build step succeeded in 0 seconds. Pytest failed with exit 5 in 1 second: 0 passed, 0 failed, 0 collected. Its three warnings say TestSkip, TestFail, and TestPass have constructors. Pip-audit reported 0 known vulnerabilities in the Python environment. These results don't establish a compiled, working fish shell.

Fish needs no hosted account or API credentials for local use. The README recommends packages over a manual CMake installation. Its source route requires Rust 1.85+, CMake 3.15+, and a C compiler, so our Python-classified run doesn't validate that route.

Windows uses WSL, Cygwin, or MSYS2. Python supports optional completion generation and browser configuration, and clipboard bindings need platform utilities. Fish has its own syntax and configuration, so Bash startup files need translation.

Useful defaults come with a different shell language

Type part of a command you've used before, and fish offers the rest beside the cursor. Press the right arrow to accept it. Invalid commands get colored as you type, and tab completion can describe candidates instead of leaving you to decode names. These are built-in behaviors documented in the fish tutorial, so you can try them before choosing plugins. I'd recommend that experience to someone tired of maintaining a terminal configuration just to get helpful feedback.

Our checkout contained 2,242 files and roughly 116,922 source lines, occupying 26.4 MB. Fish is a full shell implementation with its own language, which makes adopting it a larger decision than changing a prompt theme. Ordinary commands and pipes remain familiar. The cost appears when you bring across shell code, including configuration you've forgotten how to maintain. Decide whether you want fish's defaults enough to learn those differences before making it your login shell.

What happened when we ran it

Our run installed 35 packages in 11 seconds and occupied 38 MB at commit 35c2902 on October 5, 2026. The harness recorded a successful build step in 0 seconds. Its environment was an unprivileged Debian container using ghcr.io/astral-sh/uv:python3.12-bookworm, with 3 CPUs, 8 GB of RAM, and no secrets. Pip-audit reported 0 known vulnerabilities. These are measurements of the Python environment the harness selected. They provide no timing or security assessment of a compiled fish executable.

Pytest exited with code 5 after 1 second, reporting 0 passed and 0 failed out of 0 tests. The log explains the collection warnings: TestSkip, TestFail, and TestPass in tests/test_driver.py each have an __init__ constructor, so pytest couldn't collect them as test classes. The tail ends with three warnings. No assertion failure appears, and nothing in that log establishes a missing system package. The finding is that our command collected no tests, leaving fish's behavior unverified by this run.

The source route needs Rust and CMake

The project README specifies Rust 1.85 or later, CMake 3.15 or later, and a C compiler. It also documents extra programs needed for the full suite. That disagrees with the lab's Python ecosystem classification. The documented contributor path deserves a separate evaluation before you rely on it. For ordinary use, follow the project's package guidance: its own warning says a manual CMake installation is harder to remove or upgrade.

Our scan found 8 CI workflow files and a tests directory, with no Dockerfile. Those are useful repository signals, but they don't fill the gap left by the empty pytest collection. Similarly, the 0-second successful build record cannot establish that the documented Rust/CMake compilation completed. If you're reviewing fish for contributor work, treat these results as an incomplete evaluation of the native project. A quick successful harness step is insufficient grounds for calling the compiler path easy.

Bash configuration and heredocs need changes

Fish deliberately rejects POSIX compatibility, and the Bash migration guide gives concrete examples. Set variables with set, close blocks with end, and use string for operations that Bash expresses through parameter expansion. Fish also lacks <<EOF heredocs and Bash's [[ conditional syntax. That matters when an installation guide asks you to paste a block into the current terminal. The command may be ordinary Unix software while the surrounding shell code requires Bash.

You can keep scripts under their existing interpreter and launch them from fish. The practical friction is interactive: startup snippets, copied runbook commands, and functions need inspection. Our 0 collected tests give you no assurance about that migration. I'd choose Zsh if keeping existing Bourne-style habits matters most. Nushell deserves a look when your main frustration is manipulating text instead of structured tables. Elvish is another option if you're willing to learn a separate scripting language. None removes the need to check your own shell-dependent commands.

Optional conveniences still need host programs

The README lists Python 3.5 or newer for generating completions from manual pages and for the browser-based fish_config tool. Clipboard integration depends on platform utilities such as wl-copy and wl-paste, or macOS's pbcopy and pbpaste. These requirements matter on stripped-down hosts: installing the shell doesn't supply every surrounding convenience. Fish runs locally without a hosted account or API key. Its configuration also belongs to fish, so sourcing an existing Bash startup file is a poor migration strategy.

The 38 MB we measured belongs to the installed Python environment, not a complete inventory of these host requirements. Use your usual package manager for fish, then check the conveniences you care about on that actual machine. Windows users also need the environment described by the README: WSL, Cygwin, or MSYS2. If your requirement is a shell inside an ordinary native Windows session without those layers, pick something built for that environment.

Maintenance is active, and keyboard fixes deserve attention

The repository was pushed on October 13, 2026. GitHub showed 34,297 stars and 566 open issues and PRs when fetched on October 14. The recent activity list includes an October 12 update to a web configuration fix, alongside documentation and input-related work. The September 8 4.9.3 release fixes a macOS dead-key sequence that incorrectly inserted a space. Push and issue activity together support a judgment of continuing maintenance.

A shell handles the keystrokes between you and your work, so that keyboard fix matters more than the star count. Our 1-second pytest failure cannot tell you whether your keyboard layout or terminal behaves correctly. Install a package and start fish from your current shell, as the README suggests. Try a command from your history, paste a real runbook snippet, and use your clipboard bindings. If those daily tasks feel better and the syntax changes are acceptable, then consider changing your login shell.

Alternatives

ProjectWhat it isPick it when
ZshAn interactive shell with Bourne-style syntax and extensive customization.pick this instead when keeping existing Zsh configuration and Bourne-style habits matters most.
Nushell gh↗A shell whose pipelines work with structured values and tables.pick this instead when filtering structured data is the main reason to change shells.
ElvishAn interactive shell with its own scripting language and structured data.pick this instead when you want to compare another distinct scripting model before adopting fish.

Sources

  1. fish README: packages, platforms, dependencies, and source build
  2. fish tutorial: suggestions, completion, and interactive use
  3. fish for Bash users: deliberate syntax differences
  4. fish 4.9.3: macOS dead-key fix
  5. Web configuration fix, pull request 11861
  6. Zsh source repository
  7. Nushell source repository
  8. Elvish source repository

More dev tools reviews

compose-samples · librepods · sqlmap · coucou · world-execute-me-dsh-pv · mcp-extensions · the whole board →