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.fish
にset -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
とすればいい。