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.

