Blog Entry  (Aug. 6, 2017, 7:29 a.m.)

Tilo Mitra's avatar

[小ネタ] fishの重複パスを削除する

最近自宅のUbuntuのログインシェルを試験的にfishにしています。
「fish_user_paths は環境変数 PATH に優先的に加えられるディレクトリの配列変数」 1 ですが、fishの設定ファイルであるconfig.fishが読み込まれるたびに fish_user_paths に同じパスが何度も書かれてしまうので対策しました。

同じパスが増える理由

set -U fish_user_paths /home/use_name/.pyenv $fish_user_paths
set -U fish_user_paths /home/use_name/.go $fish_user_paths

既存の $fish_user_paths に追加していくように書いているので同じパスが追加されていってしまいます。

対策

set -U fish_user_paths (echo $fish_user_paths | tr ' ' '\n' | sort -u)

このコードをconfig.fishの最後の方に書いています。やっていることはただ sort uniq のようなことをやっているだけです。

余談

ちなみにbashなどの場合のワンライナーを書いている方がいました。 2

export PATH=`echo $PATH | tr ':' '\n' | sort -u | paste -d: -s -`;

fishで同じ考え方でやろうと思ったのですがうまくいきませんでした。

set -U fish_user_paths (echo $fish_user_paths | tr ' ' '\n' | sort -u | paste -d' ' -s)

確かに $fish_user_paths echo してみると /home/user_name/.go/bin /home/user_name/.pyenv/bin となっているのですが、これは /home/user_name/.go/bin /home/user_name/.pyenv/bin という2つのパスがあるのではなく "/home/user_name/.go/bin /home/user_name/.pyenv/bin" というパスが指定されてしまっているようでした。

つまりスペース区切りの文字列ではなくリストで定義しろということですね。

元の記事へ