fish の $PATH 変数からパスを削除するにはどうすればいいですか?

fish の $PATH 変数からパスを削除するにはどうすればいいですか?

私は Debian でシェルとして fish を使用していますが、最近 (アップグレード後) コマンド補完を使用しようとすると、次のエラーが表示されます。

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、fish が文句を言う理由は理解できますが、変数からこのパスを削除する方法が見つかりません$PATH

これをどうすればいいのか誰か知っていますか?

答え1

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

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

もし時間があるなら、PRを投稿してください。レポこの例で、私は問題を提起しましたここ

要約:

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

答え2

fish_user_pathsElijah が言うように、ベストプラクティスはグローバル ではなくを変更することですPATH。これを再び Google で検索しなくて済むようにするには…

  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

答え4

リセット魚のユーザーパス不要になったパスなし:

 $ set -U fish_user_paths /usr/local/bin /usr/bin /bin /usr/local/games /usr/game

より詳しい情報:https://fishshell.com/docs/current/tutorial.html#tut_path

関連情報