Fish: Difference between revisions

Pigeon (talk | contribs)
Show that you are in a nix-shell: add note regarding IN_NIX_SHELL variable when using new `nix shell` command
DHCP (talk | contribs)
Setting fish as default shell: remove {{expansion}} as i've implemented the changes. If this change has broken something for you, please discuss at Talk:Fish#Suggested_bashrc_in_Fish#Setting_fish_as_default_shell_needs_revision
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{DISPLAYTITLE:fish}}
{{DISPLAYTITLE:fish}}
fish, the [http://fishshell.com/ Friendly Interactive Shell], is a [[Command Shell|command shell]] designed around user-friendliness.
fish, the [https://fishshell.com/ Friendly Interactive Shell], is a [[Command Shell|command shell]] designed around user-friendliness.


== Installation ==
== Installation ==
Line 135: Line 135:
=== Setting fish as default shell ===
=== Setting fish as default shell ===


Using fish as the the login shell can cause compatibility issues. For example, certain recovery environments such as systemd's emergency mode to be completely broken when fish was set as the login shell. This  limitation is noted on the [https://wiki.gentoo.org/wiki/Fish#Caveats Gentoo] wiki. There they present an alternative, keeping bash as the system shell but having it exec fish when run interactively.
Using fish as the the login shell can cause compatibility issues. For example, certain recovery environments such as systemd's emergency mode to be completely broken when fish was set as the login shell. ArchWiki presents an [https://wiki.archlinux.org/title/Fish#Modify_.bashrc_to_drop_into_fish alternative solution], keeping bash as the system shell but having it exec fish when run interactively.


Here is one solution, which launches fish unless the parent process is already fish:
Here is one solution, which launches fish unless the parent process is already fish:
Line 143: Line 143:
programs.bash = {
programs.bash = {
   interactiveShellInit = ''
   interactiveShellInit = ''
     if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
    # "check if parent process is not fish" && "make nested shells work properly"
    then
     if grep -qv fish /proc/$PPID/comm && [[ $SHLVL == [12] ]]; then
      shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
        # set $SHELL for better integration with programs like nix shell, tmux, etc.
      exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
        SHELL=${pkgs.fish}/bin/fish exec fish
     fi
     fi
   '';
   '';
Line 153: Line 153:
}}
}}


Note that if you use the copy button to the right of the above code block, there will be a unicode space before the <code>!=</code> on line 3 of the snippet that you will need to change to a non-unicode space before executing this in your shell.
For a more detailed explanation, please see the [https://wiki.archlinux.org/title/Fish#Modify_.bashrc_to_drop_into_fish aforementioned ArchWiki page].


'''Setting fish as default for Gnome Console'''
'''Setting fish as default for Gnome Console'''
Line 180: Line 180:


==== Running fish interactively with zsh as system shell on darwin ====
==== Running fish interactively with zsh as system shell on darwin ====
{{outdated|date=May 14, 2026|reason=I've updated the interactiveShellInit snippet that this section refers to. Either the following paragraph should be reworded or the provided zsh config be modified. For more context, please see my corresponding [https://wiki.nixos.org/w/index.php?title=Fish&oldid=31760 edit] and the linked talk page.|talk=Talk:Fish#Suggested_bashrc_in_Fish#Setting_fish_as_default_shell_needs_revision}}


Zsh users on darwin will need to use a modified version of the above snippet. As written, it presents two incompatibilities. First, being BSD-derived, MacOS's <code>ps</code> command accepts different options. Second, this is a script intended for bash, not zsh. MacOS uses zsh as its default shell.
Zsh users on darwin will need to use a modified version of the above snippet. As written, it presents two incompatibilities. First, being BSD-derived, MacOS's <code>ps</code> command accepts different options. Second, this is a script intended for bash, not zsh. MacOS uses zsh as its default shell.