魚の$ PATH変数からパスを削除する方法は?


20

私はDebianでシェルとして魚を使用していますが、最近(アップグレード後)コマンド補完を使用しようとするたびに:

set: No such file or directory
set: Could not add component /usr/lib/x86_64-linux-gnu/libfm to PATH.
set: No such file or directory

これを実行する:

echo $PATH 

これを私に与えます:

/usr/lib/x86_64-linux-gnu/libfm /usr/local/bin /usr/bin /bin /usr/local/games /usr/games

私のシステムにはがありません/usr/lib/x86_64-linux-gnu/libfmので、魚が不平を言う理由はわかりますが、$PATH変数からこのパスを削除する方法を見つけることができません。

誰も私がこれを行う方法を知っていますか?


grep -R /usr/lib/x86_64-linux-gnu/libfm ~/.config/fish /usr/share/fish
グレンジャックマン14

$ grep -R / usr / lib / x86_64-linux-gnu / libfm〜/ .config / fish / usr / share / fish /home/superuser/.config/fish/fish_history:grep -R / usr / lib / x86_64- linux-gnu / libfm〜/ .config / fish / usr / share / fish
tomekK 14

回答:


33

$ PATH変数を設定する「魚」の方法は、実際に使用することset --universal fish_user_paths $fish_user_paths /new/path/hereです。次に、新しいセッションが開始されると、実際には$ fish_user_pathsが$ PATH変数の先頭に追加されます。現在、$ PATHのドキュメントには、削除方法は記載されていません。

fishでは、すべての変数は実際にはリスト(配列)であり、インデックス/インデックスを使用して各アイテムに直接アクセスできます。echo $fish_user_pathsリスト内のすべてのアイテムのスペース区切りバージョンを出力し、変換関数でスペースを改行echo $fish_user_paths | tr " " "\n"し、number lines関数で行番号を入力しますecho $fish_user_paths | tr " " "\n" | nl。次に、で削除しset --erase --universal fish_user_paths[5]ます。使用する必要があり--universalます。そうしないと、新しいセッションで機能しません。

誰かに時間があれば、この例でレポに PRを提出してください。ここで問題を開きました。

tldr;

  1. echo $fish_user_paths | tr " " "\n" | nl //削除したい番号、例えば5番目の番号を取得します
  2. set --erase --universal fish_user_paths[5] // 5番目のパスを普遍的に消去して、新しいセッションで保持する

なぜこれが難解なのですか?これはビルドイン機能であり、ドキュメントに追加して、ユーザーがGoogleにアクセスしなくても済むようにすべきではないでしょうか。まあ..
パーニルスアムセン

ここで@clozachの答えsuperuser.com/a/1212305/30982を取得し、それがaddpaths()およびremovepath()関数であり、PRを開くと、それを追加するための最初のステップになると思います。メンテナーのほとんどは、一緒に仕事をするのがとても上手で、私には不機嫌そうに見えますが、全体的には良いチャンスがあると思います。それが次のステップです。
イライジャ・リン

9

エリヤが言うように、ベストプラクティスはfish_user_pathsグローバルではなくを修正することPATHです。これをもう一度グーグルにする必要を避けるために...

  1. 変更のみを行う関数をいくつか作成しますfish_user_paths
  2. 両方の機能を自動ロードする

ユーザーパスに追加するには:

function addpaths
    contains -- $argv $fish_user_paths
       or set -U fish_user_paths $fish_user_paths $argv
    echo "Updated PATH: $PATH"
end

ユーザーパス が存在する場合に削除するにはこれに対する部分的なクレジット):

function removepath
    if set -l index (contains -i $argv[1] $PATH)
        set --erase --universal fish_user_paths[$index]
        echo "Updated PATH: $PATH"
    else
        echo "$argv[1] not found in PATH: $PATH"
    end
end

そしてもちろん、それらを自動ロードさせるには:

funcsave addpaths; funcsave removepath

使用例:

> addpaths /etc /usr/libexec
Modifying PATH: /usr/local/bin /usr/bin /bin /usr/sbin /sbin
Updated PATH: /etc /usr/libexec /usr/local/bin /usr/bin /bin /usr/sbin /sbin

> removepath /usr/libexec
Modifying PATH: /etc /usr/libexec /usr/local/bin /usr/bin /bin /usr/sbin /sbin
Updated PATH: /etc /usr/local/bin /usr/bin /bin /usr/sbin /sbin

注:この方法では、他のメカニズムを介して追加されたパスが削除されないことがわかりました。新しいターミナルセッションを開くたびに戻るパスを見つけた場合、ドットファイルのクリーンアップが適切に行われる場合があります。
クロザック

これは素晴らしいです、私の地元に追加されました!
イライジャリン

3

これにより、パス6〜最後のパスが消去されます。

set -e PATH[6..-1]

-eフラグは消去されます。をご覧くださいhelp set


これは現在のセッションでのみ機能します
Daniel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.