Software 44494 Published by

Fish 4.8.0 ships with 234 commits from 39 contributors, centering on a backend shift from GNU gettext to Fluent for translatable messages. The update finally brings -L and -P flags to the cd builtin, giving users explicit control over symbolic link resolution. Session management improves with a fix for dropped history across concurrent instances, while the upgrade process now gracefully skips legacy theme config files. Package maintainers and script writers should note the cleaned-up installation directories and the removal of automatic argument unescaping in the complete builtin.



Fish 4.8.0 Drops Fluent Translations and Adds -L/-P to cd

The Unix shell swaps GNU gettext for a more structured translation pipeline, brings native symlink flags to cd, and finally cleans up years of legacy variable handling.

Fish 4.8.0 shipped from GitHub roughly an hour ago. The biggest backend shift this release is the switch to Fluent for translatable messages in the Rust source code. Translation overhauls in shell projects usually happen quietly, but the team built out a dedicated fluent-ftl-tools library to keep string management from becoming a maintenance bottleneck.

If you actually run fish as your primary terminal, you will notice a few practical tweaks. The cd builtin finally supports -L and -P flags, giving you explicit control over symbolic link resolution. That has been a long-requested parity feature with bash and zsh. Relative path handling also gets a reliability bump. Fish will now automatically retry using the real current directory if $PWD gets hijacked elsewhere in your session.

History search no longer drops commands mid-transaction across concurrent sessions, which was a frustrating edge case if you kept multiple fish instances open. Short option completion finally respects --condition, and bind now prints the exact files where your keybindings live. Not cheap to fix in a monolithic shell, but they did it.

Screenshot_from_2026_02_17_07_42_22

Under the Hood

The upgrade path tries to be gentle. Upgrading from fish 3.x or 4.2 and older won’t trigger a fresh ~/.config/fish/conf.d/fish_frozen_theme.fish file unless your active theme actually broke from historical defaults. It also drops the __fish_initialized universal variable on startup. You can manually set --erase __fish_initialized if you are migrating and need to roll back, though most users will never need to touch it.

For package maintainers, the layout got a serious trim. Fish no longer drops files into $CMAKE_INSTALL_PREFIX/share/fish except for man pages. The old completions and functions directories have been ignored since 4.2, and this release formally shuts the door. Vendors should route custom scripts to vendor_completions.d, vendor_functions.d, or vendor_conf.d instead. Running pkgconf fish --variable="completions"dir will show you the exact fallback paths.

What to Watch For

The complete builtin’s --command and --path options no longer unescape their arguments. If your custom completions rely on that legacy behavior, you will need to adjust them before hitting this version. On the fix side, it clears out a cluster of regression bugs. Vi mode’s c,W keybinding stops wiping trailing spaces, the x command in builtin read stops misbehaving, repeated tabs will no longer duplicate smartcase completions, and pressing escape during a running command no longer spits out garbage text on the prompt.

You can grab the release directly from the fish shell GitHub repository. If you are sticking to a distro package, expect the update to roll out in your usual update cycle. Keep an eye on the release notes if your workflows lean heavily on vi mode or custom completion scripts. The shell’s source is open, and the community has already started squashing follow-up issues. Head to the fish shell releases page if you want to dig into the commit list yourself.