Project Paper A4 5mm

清書したメモが置かれる

fish_user_paths がうまく働かない

概要

パスを再設定しているとき、fish_user_pathsにパスを渡しているのに肝心のパスが通らない!という現象に陥った。

解決方法はset -U fish_user_paths /path/to/bin /hoge/to/bin /fuga/to/binと一つずつ宣言していくこと。

背景

  • fish 3.0.2
  • fish 3.1.0
    • バージョンアップすれば解決する?と思ってバージョンアップした。もちろん関係なかった。

dotfileを更新していたら、パスが通らなくなった(この原因は不明)。 fish_user_pathsを再設定しても全く通らない。

いろいろ試してみると、fish_user_pathsの設定の仕方が悪いことに気が付いた。

原因

再設定の方法、fish_user_paths.txtに記入したパスら(例: /path/to/bin /hoge/to/bin /fuga/to/bin)をセットしようと思い、

set -U fish_user_paths (cat fish_user_paths.txt)

と設定したこと。

この方法だと"/path/to/bin /hoge/to/bin /fuga/to/bin\"fish_user_paths[1]に格納されることになり、パスが

PATH=/path/to/bin /hoge/to/bin /fuga/to/bin:/usr/local/sbin:/usr/local/bin:...

になってしまう(というか、なってしまっていた)。

解決方法

set -U fish_user_paths /path/to/bin /hoge/to/bin /fuga/to/bin

と、catを使わずに行う。

あとがき

大量にfish_user_pathsを宣言したいときはどうすればいいのだろう。
黙ってconfig.fishset -x PATH /path/to/bin:$PATHを列挙していくしかないのか(やったことがないのでわからない)?

あと、よくset -U fish_user_paths /path/to/bin $fish_user_pathsする方法が推奨されているが、set -U -p fish_user_paths /path/to/binのほうがタイプ少なく済むから好き。なぜ公式サイトでも伝統的なPATH設定みたいな方法で書いてあるのか。

追記

正常なときの$__fish_config_dir/fish_variablesを見ると

SETUVAR fish_user_paths:/path/to/bin\x1e/hoge/to/bin\x1e/fuga/to/bin

と書いてある。

catを使って宣言すると

SETUVAR fish_user_paths:/path/to/bin\x20/hoge/to/bin\x20/fuga/to/bin

になる。

ここで、/path/to/bin/hoge/to/binの区切り文字を見てみると、

16進数コード 意味
\x1e レコードセパレーター[^1]
\x20 半角空白[^1]

参考: ASCIIコードの秘密 - ザリガニが見ていた...。

うーん、なるほど(?)

解決方法2

cat $__fish_config_dir/fish_variables | grep -n 'fish_user_paths'

で行数を確認してから、以下のコマンドで(58は行数、↑の出力に変えて)

sed -i -r '58 s/x20\//x1e\//g' $__fish_config_dir/fish_variables

とすればいい。