web-dev-qa-db-ja.com

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

私は魚を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変数からこのパスを削除する方法がわかりません。

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

22
tomekK

$ PATH変数を設定する「魚」の方法は、実際にset --universal fish_user_paths $fish_user_paths /new/path/hereを使用することです。その後、新しいセッションが開始すると、$ fish_user_pathsが$ PATH変数に実際に付加されます。 $ PATH documentation は、現在のところそれを削除する方法を教えていません。

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

時間があれば、この例を使って repo にPRを送信してください。私は問題をオープンしました ここ

tldr;

  1. echo $fish_user_paths | tr " " "\n" | nl //削除する番号を取得します。例:五番目
  2. set --erase --universal fish_user_paths[5] // 5番目のパスを完全に消去して、新しいセッションで永続化する
36
Elijah Lynn

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

  1. 変更のみfish_user_paths
  2. 両方の関数を作成 autoloading

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

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

ユーザーパスを削除するには存在する場合(- this)への部分的なクレジット ):

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

そしてもちろん、それらを作成するには autoloading

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
11
clozach

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

set -e PATH[6..-1]

-eフラグは消去です。見る help set

3
alxrsngrtn

不要なパスを指定せずにリセットfish_user_paths

 $ 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

0
gagarine