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

前提
デフォルトシェルは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
どうやら~/.bashrc
のwhich 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に任せるってことなら後者の方がいいのかもしれない?
おわり