@ledsun blog

無味の味は佳境に入らざればすなわち知れず

Windows10のWSL起動時にfish-shellからrbenvの初期化に失敗する

WSL起動時に次のエラーメッセージが表示されます。

source: Error encountered while sourcing file '/tmp/.psub.N1u4nIBokn':
source: No such file or directory
rm: cannot remove '/tmp/.psub.N1u4nIBokn': No such file or directory
Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish

rbenvを初期化するためのコマンドsource (rbenv init -|psub)の実行に失敗しているためにでているエラーメッセージです。 この状態ではrubyコマンドが見つかりません。

ledsun@MSI:~►ruby                                                                                                  23:01

Command 'ruby' not found, but can be installed with:

sudo snap install ruby  # version 3.1.1, or
sudo apt  install ruby  # version 1:2.7+1

See 'snap info ruby' for additional versions.

もう一度source (rbenv init -|psub)すればrbenvは初期化されます。 rubyコマンドが使えるようになります。

ledsun@MSI:~[127]source (rbenv init -|psub)                                                                0.127s 23:01
ledsun@MSI:~►ruby

fish-shell同じエラーメッセージがでるissueがあります。

github.com

close済みです。 WSLに関する情報も載っていません。

psubは名前付きパイプの代わりに一時ファイルをつかうfish-shellの組み込みコマンドです。

fishshell.com

わかった風に書いていますが、名前付きパイプがなにかはわかっていません。 やっていることは、次のようにrbenv initコマンドで初期化スクリプトを出力します。

ledsun@MSI:~[1]►rbenv init -                                                                                       23:16
set -gx PATH '/home/ledsun/.rbenv/shims' $PATH
set -gx RBENV_SHELL fish
command rbenv rehash 2>/dev/null
function rbenv
  set command $argv[1]
  set -e argv[1]

  switch "$command"
  case rehash shell use
    rbenv "sh-$command" $argv|source
  case '*'
    command rbenv "$command" $argv
  end
end

psubを使ってスクリプトを一時ファイルに書き込みます。 一時ファイルのパスを返します。

ledsun@MSI:~►echo (rbenv init -|psub)                                                                              23:17
/tmp/.psub.qMqt1fQTDG

これをsourceコマンドで読み込むだけなので、失敗しないはずです。 WSLの起動中だと一時ファイルへの書き込みに失敗するか、書いた一時ファイルが消えるかしているのでしょうか?

20220409追記

Windows 11にしたら起きなくなりました。 WSLのバージョンに依存していたようです。

20220501追記

また、起きるようになりました。

WSLの起動時にfish-shellでrbenvの初期化に失敗するところ