わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

「cat: -: そのようなファイルやディレクトリはありません」の原因は

 環境変数TMPDIRに,RAMディスクのディレクトリを指定していたのが,不具合の原因でした.「unset TMPDIR」を入れることで,解決しました.

WSL2に移行してからrbenv installができなくなったなあとぼやきながら

汗をかこう!

 具体的には,次の状況でした.

  • tmuxで新規ウィンドウ(シェルはzsh)を作成すると,コマンドプロンプトの前に「cat: -: そのようなファイルやディレクトリはありません」と表示される.
  • rbenv install 2.8.0-devを実行すると,インストールが途中で終了する.ログを見ても,原因が何なのか分からない.

 rbenvのログの終わりのほうは,こんな感じで,「cat: -: No such file or directory」が大量に出力されています.

cat: -: No such file or directory
cat: -: No such file or directory
cat: -: No such file or directory
cat: -: No such file or directory
cat: -: No such file or directory
cat: -: No such file or directory
cat: -: No such file or directory
cat: -: No such file or directory
cat: -: No such file or directory
checking for ruby... (略)
downloading config.guess ... done
downloading config.sub ... done
checking build system type... cat: -: No such file or directory
x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
checking for gcc... gcc
cat: -: No such file or directory
checking whether the C compiler works... no
configure: error: in `/mnt/z/wsl_tmp/ruby-build.(略)':
configure: error: C compiler cannot create executables
See `config.log' for more details

 catコマンドが悪いようには,思えません.むしろrbenvのほうです.シェルでrbenv init -を実行すると,出力はこうでした.

export PATH="/home/takehikom/.rbenv/shims:${PATH}"
export RBENV_SHELL=zsh
source '/home/takehikom/.rbenv/libexec/../completions/rbenv.zsh'
command rbenv rehash 2>/dev/null
cat: -: そのようなファイルやディレクトリはありません

 .zshrcには,~/.rbenvのディレクトリがあるときには,~/.rbenv/binをPATHに追加してから,eval "$(rbenv init -)"を実行するよう,書いていて,ここが原因と分かったものの,対策が思いつかずに,1か月近くが過ぎました.


 昨夜,いくつか記事を読んで,Microsoft Store経由でインストールしていたUbuntuをアンインストールし,再起動してから,Microsoft Store経由でUbuntuをインストールしてみました.
 .zshrcや.tmux.confなど,重要なディレクトリやファイルはバックアップをとっていて,Ubuntuの端末上でコピーしてからUbuntu(やPC本体の)再起動をしたところ,catのエラーがなくなったかのように見えました.
 しかしrbenvをインストールしたあと,tmuxで新規ウィンドウを作成すると,再び,「cat: -: そのようなファイルやディレクトリはありません」と表示されるようになりました.
 一つ一つ,zshの設定行を見ていくと,環境変数TMPDIRが目に留まりました.WSLのとき,YドライブとZドライブを順に見て,実在するドライブ---Windowsで個人的に設定している,RAMディスクのドライブです---なら,そこにwsl_tmpというディレクトリを作り,そのパスを環境変数としています.上記のエラーログの「/mnt/z/wsl_tmp」の箇所です.
 シェル上でunset TMPDIRを実行し,rbenv init -を実行すると,catのエラーがなくなりました.

export PATH="/home/takehiko/.rbenv/shims:${PATH}"
export RBENV_SHELL=zsh
source '/home/takehiko/.rbenv/libexec/../completions/rbenv.zsh'
command rbenv rehash 2>/dev/null
rbenv() {
(略)
}

 .zshrcに,ホスト名の条件指定で,unset TMPDIRを実行するよう,指示を加えて,シェルを起動すると,エラーが出なくなり,rbenv install 2.8.0-devも,できるようになりました.さっそくrbenv global 2.8.0-devを実行しました.


 自分が使用しているいくつかのWindows PCで,WSL2を使用しているのは,この記事を書いているPCのみです.Windows Insider Program(スロー)に登録しています.
 WSL2のインストール・再インストールで参考にした記事です.

 tmuxの起動時にエラーが出るようになりました.以下のページを読んで対処すると,解決しましたので,はてブしました.

 .zshrcに記載している,WSLであるかの判定方法も,書き換えました.変更後のコードの抜粋は次のとおりです.

case "`uname -sr`" in
    Linux*icrosoft*); export ARCHI="wsl" ;;
    Linux*);          export ARCHI="linux" ;;
    CYGWIN*);         export ARCHI="cygwin" ;;
    *);               export ARCHI="unknown" ;;
esac

 WSL2の利用前は,「Linux*icrosoft*)」ではなく「Linux*Microsoft); 」でした.あるWSL環境での,uname -srの出力は,「Linux 4.4.0-18362-Microsoft」でした.しかしWSL2では「Linux 4.19.84-microsoft-standard」となっています.両方に対応するよう,「Linux*icrosoft*)」としたのでした.