Open1

[BUG] bashからmiseでインストールしたfishを実行するとPATHが2倍になる

ras0qras0q

前提

デフォルトシェルはbashにして、インタラクティブモードのときにfishを呼び出している
パッケージマネージャはmiseを使っている
環境変数は基本bashで設定する (VSCodeなどbashのみを使いたいときもたまにあるため)

Before

~/.bash_profile
# miseとmise shimsのパスを追加する
export PATH=~/.local/bin:~/.local/share/mise/shims:$PATH

# ...

[ -f ~/.bashrc ] && source ~/.bashrc
~/.bashrc
# Interactive mode
[[ $- == *i* && $- != *c* && $- != *s* ]] || exit 0

# Execute fish if installed
FISH=$(which fish || exit 0) # mise shimsのパスが取れる
[[ -z "$WARP_IS_LOCAL_SHELL_SESSION" ]] || exit 0 # Warpでは実行しない

exec $FISH -l
~/.config/fish/config.fish
if status is-interactive
    # mise
    mise activate fish | source
    mise completion fish | source

    # ...
end

Expected

fish
$ echo $PATH | tr ' ' '\n' | nl
     1  /home/ras/.local/share/mise/installs/aqua-1password-cli/v2.30.0
     2  /home/ras/.local/share/mise/installs/aqua-burnt-sushi-ripgrep/14.1.1/ripgrep-14.1.1-x86_64-unknown-linux-musl
    # mise activate fishで追加されたPATH群...
    27  /home/ras/.local/bin
    # 自分で追加したPATH群...
    31  /usr/local/sbin
    32  /usr/local/bin
    33  /usr/sbin
    34  /usr/bin
    35  /sbin
    36  /bin
    37  /usr/games
    38  /usr/local/games
    39  /usr/lib/wsl/lib
    40  /snap/bin

Actual

fish
$ echo $PATH | tr ' ' '\n' | nl
     1  /home/ras/.local/share/mise/installs/aqua-1password-cli/v2.30.0
     2  /home/ras/.local/share/mise/installs/aqua-burnt-sushi-ripgrep/14.1.1/ripgrep-14.1.1-x86_64-unknown-linux-musl
    # miseによって追加されたPATH群...
    27  /home/ras/.local/bin
    28  /home/ras/.local/share/mise/installs/aqua-1password-cli/v2.30.0
    29  /home/ras/.local/share/mise/installs/aqua-burnt-sushi-ripgrep/14.1.1/ripgrep-14.1.1-x86_64-unknown-linux-musl
    # miseによって追加されたPATH群... (2週目⁉️⁉️⁉️⁉️⁉️)
    #
    # 自分で追加したPATH群...
    57  /usr/local/sbin
    58  /usr/local/bin
    59  /usr/sbin
    60  /usr/bin
    61  /sbin
    62  /bin
    63  /usr/games
    64  /usr/local/games
    65  /usr/lib/wsl/lib
    66  /snap/bin

なぜか2回追加されてしまう

Why?

psでプロセスを見ると~/.bashrcではexec fish -lしただけなのになぜか-C ...ととてもロングなオプションが追加されている

fish
$ ps auxfwww
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0 166000  6416 ?        Ss   May01   0:29 /sbin/init
root      305921  0.0  0.0   2464   120 ?        Ss   13:57   0:00  \_ /init
root      305923  0.0  0.0   2480   124 ?        S    13:57   0:00      \_ /init
ras       305925  0.2  0.0  19008  7672 pts/4    Ssl  13:57   0:01          \_ /home/ras/.local/share/mise/installs/aqua-fish-shell-fish-shell/4.0.2/fish -C set -gx CARGO_HOME /home/ras/.cargo set -gx DENO_INSTALL_ROOT /home/ras/.local/share/mise/installs/deno/2.3.1/.deno set -gx GOBIN /home/ras/.local/share/mise/installs/go/1.24.2/bin set -gx GOROOT /home/ras/.local/share/mise/installs/go/1.24.2 set -gx RUSTUP_HOME /home/ras/.rustup set -gx RUSTUP_TOOLCHAIN 1.86.0 fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-1password-cli/v2.30.0 fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-burnt-sushi-ripgrep/14.1.1/ripgrep-14.1.1-x86_64-unknown-linux-musl fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-ajeetdsouza-zoxide/0.9.7 fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-astral-sh-uv/0.7.2/uv-x86_64-unknown-linux-musl fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-cargo-bins-cargo-binstall/1.12.3 fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-cli-cli/2.72.0/gh_2.72.0_linux_amd64/bin fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-fish-shell-fish-shell/4.0.2 fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-golangci-golangci-lint/2.1.5/golangci-lint-2.1.5-linux-amd64 fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-helix-editor-helix/25.01.1/helix-25.01.1-x86_64-linux fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-joerdav-xc/0.8.5 fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-jqlang-jq/1.7.1 fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-junegunn-fzf/0.61.3 fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-sharkdp-fd/10.2.0/fd-v10.2.0-x86_64-unknown-linux-musl fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-starship-starship/1.23.0 fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-sxyazi-yazi/25.4.8/yazi-x86_64-unknown-linux-musl fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-x-motemen-ghq/1.8.0/ghq_linux_amd64 fish_add_path -gm /home/ras/.local/share/mise/installs/aqua-zellij-org-zellij/0.42.2 fish_add_path -gm /home/ras/.local/share/mise/installs/cargo-eza/0.21.2/bin fish_add_path -gm /home/ras/.local/share/mise/installs/deno/2.3.1/bin fish_add_path -gm /home/ras/.local/share/mise/installs/deno/2.3.1/.deno/bin fish_add_path -gm /home/ras/.local/share/mise/installs/go/1.24.2/bin fish_add_path -gm /home/ras/.local/share/mise/installs/node/22.15.0/bin fish_add_path -gm /home/ras/.local/share/mise/installs/npm-typescript/5.8.3/bin fish_add_path -gm /home/ras/.local/share/mise/installs/npm-typescript-language-server/4.3.4/bin fish_add_path -gm /home/ras/.cargo/bin fish_add_path -gm /home/ras/.local/share/mise/installs/usage/2.1.1 -l

どうやら~/.bashrcwhich fishでは~/.local/share/mise/shims/fishが取得できるのだが(ここまでは想定済み)、これを実行するとこれまでのPATHを追加しながらfishを実行するという仕組みになっているらしい
仕様として正しいと言われれば正しいような気もするがexecでコマンドが塗り替えられたのもあって、なかなか気づかなかった

After

~/.bash_profileにmise shimsを追加するのは正しいのでそのまま

~/.bashrcでshimsではなくfishの素のPATHを実行するようにする

~/.bashrc
# Execute fish if installed
-FISH=$(which fish || exit 0)
+FISH=$(mise which fish || which fish || exit 0)

あるいは環境変数の設定はbash側のmiseに任せて~/.config/fish/config.fishではactivateしない

~/.config/fish/config.fish
if status is-interactive
    # mise
-   mise activate fish | source
    mise completion fish | source

    # ...
end

環境変数の設定をbashに任せるってことなら後者の方がいいのかもしれない?

おわり