Как удалить путь из переменной $PATH в fish?

Как удалить путь из переменной $PATH в fish?

Я использую fish в качестве оболочки в 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, поэтому я понимаю, почему 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", а затем пронумерует строки с помощью функции number lines, 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_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. .

решение4

Перезагрузить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

Связанный контент