mrkeyoor.com_
Tue 01 Sept 16:09 UTC
Dev Toolsevaluationupdated 30 Aug 2026

fish-shell review

Fish is an interactive command-line shell for macOS, Linux, BSD-family systems, and Windows through WSL, Cygwin, or MSYS2. It provides syntax coloring, suggestions from history, and command completions out of the box, reducing the configuration normally needed to make Bash or Zsh comfortable for daily terminal work.

+8 / 1dstars / 7d
Verdict

Our Fish harness installed 35 packages and built in 2 seconds, but Pytest collected 0 tests and exited 5, so this run does not validate the shell's documented Rust build or behavior. Fish is still an excellent daily shell for someone who values suggestions and completions more than POSIX syntax compatibility. Install the signed package, try it without changing your login shell, and move only after your real commands and terminal behave correctly.

We ran it

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

Answers from our run

Does fish-shell build from source?

Dependencies installed in 18 seconds (35 packages), and the build succeeded in 2 seconds. We cloned commit b5066b0 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?

Users who need their interactive shell to accept POSIX shell syntax unchanged: Fish documents several deliberate differences from Bash and Zsh.

What are the alternatives to fish-shell?

Zsh, Nushell, Elvish. Our Fish harness installed 35 packages and built in 2 seconds, but Pytest collected 0 tests and exited 5, so this run does not validate the shell's documented Rust build or behavior.

Setup4/5Packaged installs are easy; source builds need Rust and CMake
Docs5/5Tutorial, command reference, migration notes, and help are detailed
Community5/534,097 stars with pushes and issue responses in August 2026
Maturity5/5Version 4.8.1 spans major platforms with signed release files

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 spend hours in an interactive terminal and want useful defaults immediately.
People willing to learn Fish syntax instead of carrying Bash or Zsh configuration unchanged.
Teams that want shared completions, functions, abbreviations, and vendor configuration directories.
macOS and Linux users who can install a signed package rather than compile the source checkout.

Who it’s NOT for

Users who need their interactive shell to accept POSIX shell syntax unchanged: Fish documents several deliberate differences from Bash and Zsh.
Automation that must run under /bin/sh across ordinary Unix hosts: Fish is an interactive shell with its own language, not a portable script baseline.
Source builders expecting a small toolchain: the README requires Rust 1.85 or later, CMake 3.15 or later, a C compiler, and extra programs for the full suite.
Terminal workflows built around extremely long pasted commands: open issue 11029 reports multi-line input being truncated in terminal scrollback.
Anyone reading our Pytest result as Fish's real suite: the harness collected 0 tests and exited 5 after three collection warnings.

Setup reality

Our Python-oriented sandbox path installed 35 packages in 18 seconds and used 38 MB. Its build step succeeded in 2 seconds. Pytest then failed with exit 5 in 4 seconds after collecting 0 tests; the log showed three warnings because TestSkip, TestFail, and TestPass define constructors.

That path is not the source build documented by Fish. The README requires Rust 1.85+, CMake 3.15+, and a C compiler, with PCRE2 and gettext depending on configuration. The full test suite also needs diff, git, Python, pexpect, less, tmux, and wget.

Most users should install a release package. Fish itself warns that a CMake source install is harder to uninstall or upgrade. Runtime extras such as manual-page completions, clipboard tools, and the web configuration screen depend on separate host programs.

Fish improves the prompt before you configure it

Fish starts with syntax highlighting, suggestions based on command history, and context-aware tab completion. Those features work before installing a theme or plugin manager. Mistyped paths and invalid commands are colored while you type, history suggestions appear in the input line, and completion descriptions make unfamiliar commands easier to inspect. For someone who lives in a terminal, this saves the hours often spent assembling a comparable Zsh setup.

The project supports macOS 10.12 or later, Linux packages from several sources, BSD-family systems, and Windows through WSL, Cygwin, or MSYS2. Fish 4.8.1 also ships standalone Linux binaries for listed CPU architectures. Our measured checkout was much larger than a shell configuration bundle: 2,206 files, about 116,293 source lines, and 25.6 MB before its lab dependencies were installed.

Its language is easier to read and different from POSIX sh

Fish keeps familiar commands and pipes while changing shell syntax it considers awkward. Variables use set, blocks close with end, and command substitutions use parentheses or $(). The tutorial marks these differences with the phrase unlike other shells. Existing Bash aliases, startup files, conditionals, and parameter-expansion tricks do not transfer line for line. That is the largest adoption cost.

This separation is often good for interactive work because Fish can make clearer choices without preserving decades of Bourne-shell syntax. It is still the wrong interpreter for a portable deployment script. Keep scripts on their declared Bash, POSIX sh, or other runtime shebang. Fish can be the login interface that launches them. A team should document that split so commands copied from a runbook are not silently interpreted under the wrong language.

What happened when we ran it

Our sandbox classified the checkout as Python-oriented and installed 35 packages in 18 seconds, consuming 38 MB. Its build command succeeded in 2 seconds. The environment was a fresh unprivileged Debian container with 3 CPUs and 8 GB of RAM. Pip-audit reported 0 known vulnerabilities in those installed Python packages. These figures describe the harness path at commit b5066b0.

Pytest failed with exit code 5 after 4 seconds and reported 0 passed and 0 failed out of 0. The log ended with three PytestCollectionWarning messages. Classes named TestSkip, TestFail, and TestPass in tests/test_driver.py each define an __init__ constructor, so Pytest did not collect them as test classes. The log shows no failed Fish behavior because no test ran.

The result should not be confused with the documented build. Fish's README describes a Rust and CMake project, while our automatic path exercised Python packaging and Pytest. The checkout does contain a tests directory and 8 CI workflow files, but that does not turn 0 collected tests into coverage. A source evaluation needs the project's CMake or Cargo instructions and its stated full-suite dependencies.

Source compilation needs Rust 1.85 and CMake 3.15

The current README requires Rust 1.85 or later, CMake 3.15 or later, and a C compiler. PCRE2 can be downloaded when absent, while gettext supplies translated messages. Running the full suite adds diff, git, Python 3.5 or later, pexpect, less, tmux, and wget. Building documentation from a clone may also need Sphinx. This is a serious contributor toolchain for a program that most users install with one package-manager command.

Fish itself recommends packaged builds because a manual CMake install is difficult to remove or upgrade. Homebrew, MacPorts, Linux repositories, signed tarballs, standalone apps, and development packages cover common hosts. Cargo can install standalone binaries, though a full CMake installation also places man pages, local HTML documentation, and vendor directories. The sensible user path is a package; compilation is for contributors and unusual targets.

Optional conveniences still depend on host utilities

Fish needs normal Unix tools at runtime and uses mktemp in addition to basic POSIX utilities. Some conveniences have extra dependencies. Manual-page completion generation and the fish_config web tool use Python, clipboard bindings need tools such as wl-copy, xclip, or pbcopy, and one default binding uses file. Missing one does not stop the shell, but the corresponding feature can disappear.

Terminal behavior also merits a trial. Open issue 11029 reports that a multi-line command longer than the visible terminal height is truncated in terminal-emulator scrollback, with alt-v offered as a workaround to edit it externally. Release 4.8.1 fixed separate input regressions involving Alt-word movement and a crash in commandline --current-process. Interactive shells sit directly between keystrokes and work, so small regressions are unusually noticeable.

Version 4.8.1 is current, with active issue handling

GitHub listed 34,097 stars and 567 combined issues and pull requests when fetched. The repository was pushed on August 29, 2026. Release 4.8.1 arrived on July 13 and mainly corrected 4.8.0 regressions while adding separate colors for builtins and functions. Recent issue updates continued through August 30, which shows activity beyond the release tag.

Fish earns a recommendation as an interactive shell, especially for developers who have never enjoyed maintaining a pile of prompt plugins. The language difference is a product decision, not a hidden defect, but it makes a reversible trial important. Run fish from the current shell first, test completion, history, SSH, tmux, clipboard actions, and copied commands, then decide whether to make it the login shell. Our failed 0-test Pytest run offers no shortcut for that evaluation.

Alternatives

ProjectWhat it isPick it when
ZshA mature interactive shell with broad POSIX heritage and extensive customization.pick this instead when existing Zsh plugins and closer Bourne-shell syntax matter more than built-in defaults.
Nushell gh↗A modern shell that treats pipeline data as structured values and tables.pick this instead when typed structured data is more useful than traditional text pipelines.
ElvishAn interactive shell with a distinct language, searchable history, and structured values.pick this instead when you want a smaller alternative built around its own scripting model.

What people are saying

  1. [github-trending] fish-shell/fish-shell

Sources

  1. Fish shell README
  2. Fish shell repository
  3. Fish 4.8.1 release
  4. Fish tutorial
  5. Long multi-line command issue

More dev tools reviews

v2rayNG · SecLists · hashcat · eslint · fastfetch · composer · the whole board →