The user-friendly command line shell. https://fishshell.com
  • Shell 57.2%
  • Rust 38.5%
  • Python 3.1%
  • HTML 0.3%
  • JavaScript 0.3%
  • Other 0.3%
Find a file
Peter Ammon 8768b458a6
Correct user/sys time printing
These were swapped.
2026-06-13 12:41:38 -07:00
.builds Update BSD sourcehut images 2025-11-09 13:08:47 +01:00
.cargo xtask: add initial setup 2026-01-21 17:43:26 +01:00
.github Remove unused workflow to build docker images 2026-05-30 18:05:50 +08:00
benchmarks Clean up shell scripts 2025-04-29 10:14:06 +02:00
build_tools update-dependencies: fix catpuccin theme path 2026-05-30 13:57:27 +08:00
cmake CMake: stop installing embedded files 2026-05-10 02:06:04 +08:00
contrib Release 4.7.1 2026-05-08 00:02:14 +08:00
crates fs: correct path formatting in an error message 2026-06-09 22:31:14 +09:00
doc_internal rename: crate::wchar::prelude -> crate::prelude 2025-12-19 19:37:11 +01:00
doc_src Remove extraneous dash in path basename description 2026-06-13 12:40:44 -07:00
docker build_tools/update-dependencies.sh 2026-05-30 17:52:48 +08:00
etc Update /etc/config.fish to use current syntax 2020-05-08 15:20:36 +08:00
localization/po path_emit_config_directory_messages: also print error about ~/.cache 2026-06-09 22:24:07 +09:00
osx format: use 4-space indents in more files 2026-03-09 16:52:07 +11:00
share Make internal path variables read-only 2026-06-09 22:31:14 +09:00
src Correct user/sys time printing 2026-06-13 12:41:38 -07:00
tests Cleanup and add tests for cd builtin 2026-06-11 22:48:52 -07:00
updatecli.d CI: use Python from uv's virtualenv 2026-05-30 17:52:48 +08:00
vagrants/bsds lint: fix ShellCheck warnings 2026-04-22 14:23:25 +08:00
.clang-format Add back .clang-format 2024-08-07 13:11:22 +02:00
.editorconfig format: use 2-space indents in toml files 2026-05-03 20:04:21 +08:00
.gitattributes tarball: include .cargo/config.toml again 2026-01-14 18:28:04 +01:00
.gitignore Prune stale gitignore rules 2026-04-22 00:09:57 +08:00
.rustfmt.toml build_tools/style.fish: check that {rustfmt,Cargo}.toml edition specs are in sync 2025-11-01 12:42:55 +01:00
BSDmakefile BSD/GNUmakefile: update to use new fish_run_tests target 2025-02-12 08:56:38 +08:00
build.rs gate benchmark feature on nightly toolchain 2026-04-19 17:38:04 +08:00
Cargo.lock build_tools/update-dependencies.sh 2026-05-30 17:52:48 +08:00
Cargo.toml build_tools/update-dependencies.sh 2026-05-30 17:52:48 +08:00
CHANGELOG.rst Changelog fix for #12700 2026-06-11 22:48:53 -07:00
clippy.toml Add disallowed-methods to clippy.toml 2026-06-08 12:28:48 -05:00
CMakeLists.txt format: use 4-space indents in more files 2026-03-09 16:52:07 +11:00
CODE_OF_CONDUCT.md Remove redundant newlines, add .idea to gitignore 2024-12-29 15:31:03 +01:00
CONTRIBUTING.rst docs: standardise on "fish" as the name for the shell 2026-06-02 14:13:24 +08:00
COPYING update copyright years to be unbounded 2025-01-08 20:38:43 +08:00
deny.toml format: reformat TOML files 2026-05-23 01:00:27 +08:00
fish.pc.in Use pkg-config variables 2020-04-04 13:07:54 +02:00
fish.png fish.png: use the same thing we ship with the docs 2021-10-16 14:12:44 -07:00
fish.spec.in RPM/Debian packaging: add pkg-config dependency 2026-05-03 23:05:03 +08:00
GNUmakefile editorconfig: set indent_style=tab for makefiles 2026-02-03 11:26:59 +11:00
pyproject.toml CI: use Python from uv's virtualenv 2026-05-30 17:52:48 +08:00
README.rst docs: standardise on "fish" as the name for the shell 2026-06-02 14:13:24 +08:00
SECURITY.md Add myself as SECURITY contact and reformat 2025-05-11 11:48:03 -07:00
uv.lock build_tools/update-dependencies.sh 2026-05-30 17:52:48 +08:00

`fish <https://fishshell.com/>`__ - the friendly interactive shell |Build Status|
=================================================================================

fish is a smart and user-friendly command line shell for macOS, Linux,
and the rest of the family. fish includes features like syntax
highlighting, autosuggest-as-you-type, and fancy tab completions that
just work, with no configuration required.

For downloads, screenshots and more, go to https://fishshell.com/.

Quick Start
-----------

fish generally works like other shells, like bash or zsh. A few
important differences can be found at
https://fishshell.com/docs/current/tutorial.html by searching for the
magic phrase “unlike other shells”.

Detailed user documentation is available by running ``help`` within
fish, and also at https://fishshell.com/docs/current/index.html

Getting fish
------------

macOS
~~~~~

fish can be installed:

-  using `Homebrew <https://brew.sh/>`__: ``brew install fish``
-  using `MacPorts <https://www.macports.org/>`__:
   ``sudo port install fish``
-  using the `installer from fishshell.com <https://fishshell.com/>`__
-  as a `standalone app from fishshell.com <https://fishshell.com/>`__

Note: The minimum supported macOS version is 10.12.

Packages for Linux
~~~~~~~~~~~~~~~~~~

Packages for Debian, Fedora, openSUSE, and Red Hat Enterprise
Linux/CentOS are available from the `openSUSE Build
Service <https://software.opensuse.org/download.html?project=shells%3Afish&package=fish>`__.

Packages for Ubuntu are available from the `fish
PPA <https://launchpad.net/~fish-shell/+archive/ubuntu/release-4>`__,
and can be installed using the following commands:

::

   sudo apt-add-repository ppa:fish-shell/release-4
   sudo apt update
   sudo apt install fish

Instructions for other distributions may be found at
`fishshell.com <https://fishshell.com>`__.

Windows
~~~~~~~

-  On Windows 10/11, fish can be installed under the WSL Windows Subsystem
   for Linux with the instructions for the appropriate distribution
   listed above under “Packages for Linux”, or from source with the
   instructions below.
-  fish can also be installed on all versions of Windows using
   `Cygwin <https://cygwin.com/>`__ or `MSYS2 <https://github.com/Berrysoft/fish-msys2>`__.

Building from source
~~~~~~~~~~~~~~~~~~~~

If packages are not available for your platform, GPG-signed tarballs are
available from `fishshell.com <https://fishshell.com/>`__ and
`fish-shell on
GitHub <https://github.com/fish-shell/fish-shell/releases>`__. See the
`Building <#building>`_ section for instructions.

Running fish
------------

Once installed, run ``fish`` from your current shell to try fish out!

Dependencies
~~~~~~~~~~~~

Running fish requires:

-  some common \*nix system utilities (currently ``mktemp``), in
   addition to the basic POSIX utilities (``cat``, ``cut``, ``dirname``,
   ``ls``, ``mkdir``, ``mkfifo``, ``rm``, ``sh``, ``sort``, ``tee``, ``tr``,
   ``uname`` and ``sed`` at least, but the full coreutils plus ``find`` and
   ``awk`` is preferred)

The following optional features also have specific requirements:

-  builtin commands that have the ``--help`` option or print usage
   messages require ``man`` for display
-  automated completion generation from manual pages requires Python 3.5+
-  the ``fish_config`` web configuration tool requires Python 3.5+ and a web browser
-  the :ref:`alt-o <shared-binds-alt-o>` binding requires the ``file`` program.
-  system clipboard integration (with the default Ctrl-V and Ctrl-X
   bindings) require either the ``xsel``, ``xclip``,
   ``wl-copy``/``wl-paste`` or ``pbcopy``/``pbpaste`` utilities
-  full completions for ``yarn`` and ``npm`` require the
   ``all-the-package-names`` NPM module
-  ``colorls`` is used, if installed, to add color when running ``ls`` on platforms
   that do not have color support (such as OpenBSD)

Building
--------

Dependencies
~~~~~~~~~~~~

Compiling fish requires:

-  Rust (version 1.85 or later), including cargo
-  CMake (version 3.15 or later)
-  a C compiler (for system feature detection and the test helper binary)
-  PCRE2 (headers and libraries) - optional, this will be downloaded if missing
-  gettext (only the msgfmt tool) - optional, for translation support
-  an Internet connection, as other dependencies will be downloaded automatically

Sphinx is also optionally required to build the documentation from a
cloned git repository.

Additionally, running the full test suite requires diff, git, Python 3.5+, pexpect, less, tmux and wget.

Building from source with CMake
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Rather than building from source, consider using a packaged build for your platform. Using the
steps below makes fish difficult to uninstall or upgrade. Release packages are available from the
links above, and up-to-date `development builds of fish are available for many platforms
<https://github.com/fish-shell/fish-shell/wiki/Development-builds>`__

To install into ``/usr/local``, run:

.. code:: shell

   mkdir build; cd build
   cmake ..
   cmake --build .
   sudo cmake --install .

The install directory can be changed using the
``-DCMAKE_INSTALL_PREFIX`` parameter for ``cmake``.

CMake Build options
~~~~~~~~~~~~~~~~~~~

In addition to the normal CMake build options (like ``CMAKE_INSTALL_PREFIX``), fish's CMake build has some other options available to customize it.

- Rust_COMPILER=path - the path to rustc. If not set, cmake will check $PATH and ~/.cargo/bin
- Rust_CARGO=path - the path to cargo. If not set, cmake will check $PATH and ~/.cargo/bin
- Rust_CARGO_TARGET=target - the target to pass to cargo. Set this for cross-compilation.
- WITH_DOCS=ON|OFF - whether to build the documentation. By default, this is ON when Sphinx is installed.
- FISH_INDENT_FOR_BUILDING_DOCS - useful for cross-compilation.
  Set this to the path to the ``fish_indent`` executable to use for building HTML docs.
  By default, ``${CMAKE_BINARY_DIR}/fish_indent`` will be used.
  If that's not runnable on the compile host,
  you can build a native one with ``cargo build --bin fish_indent`` and set this to ``$PWD/target/debug/fish_indent``.
- FISH_USE_SYSTEM_PCRE2=ON|OFF - whether to use an installed pcre2. This is normally autodetected.
- WITH_MESSAGE_LOCALIZATION=ON|OFF - whether to include translations.
- extra_functionsdir, extra_completionsdir and extra_confdir - to compile in an additional directory to be searched for functions, completions and configuration snippets

Building fish with Cargo
~~~~~~~~~~~~~~~~~~~~~~~~

You can also build fish with Cargo.
This example uses `uv <https://github.com/astral-sh/uv>`__ to install Sphinx (which is used for man-pages and ``--help`` options).
You can also install Sphinx another way and drop the ``uv run --no-managed-python`` prefix.

.. code:: shell

    git clone https://github.com/fish-shell/fish-shell
    cd fish-shell

    # Optional: check out a specific version rather than building the latest
    # development version.
    git checkout "$(git for-each-ref refs/tags/ | awk '$2 == "tag" { print $3 }' | tail -1)"

    uv run --no-managed-python \
        cargo install --path .

This will place standalone binaries in ``~/.cargo/bin/``, but you can move them wherever you want.

To disable translations, disable the ``localize-messages`` feature by passing ``--no-default-features --features=embed-manpages`` to cargo.

You can also link this build statically (but not against glibc) and move it to other computers.

Here are the remaining advantages of a full installation, as currently done by CMake:

- Man pages like ``fish(1)`` installed in standard locations, easily accessible from outside fish.
- Separate files for builtins (e.g. ``$PREFIX/share/fish/man/man1/abbr.1``).
- A local copy of the HTML documentation, typically accessed via the ``help`` fish function.
  In Cargo builds, ``help`` will redirect to `<https://fishshell.com/docs/current/>`__
- Ability to use our CMake options extra_functionsdir, extra_completionsdir and extra_confdir,
  (also recorded in ``$PREFIX/share/pkgconfig/fish.pc``)
  which are used by some package managers to house third-party completions.
  Regardless of build system, fish uses ``$XDG_DATA_DIRS/{vendor_completion.d,vendor_conf.d,vendor_functions.d}``.

Contributing Changes to the Code
--------------------------------

See the `Guide for Developers <CONTRIBUTING.rst>`__.

Contact Us
----------

Questions, comments, rants and raves can be posted to the official fish
mailing list at https://lists.sourceforge.net/lists/listinfo/fish-users
or join us on our `matrix
channel <https://matrix.to/#/#fish-shell:matrix.org>`__. Or use the `fish tag
on Unix & Linux Stackexchange <https://unix.stackexchange.com/questions/tagged/fish>`__.
There is also a fish tag on Stackoverflow, but it is typically a poor fit.

Found a bug? Have an awesome idea? Please `open an
issue <https://github.com/fish-shell/fish-shell/issues/new>`__.

.. |Build Status| image:: https://github.com/fish-shell/fish-shell/actions/workflows/test.yml/badge.svg
   :target: https://github.com/fish-shell/fish-shell/actions/workflows/test.yml