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

20

Я использую 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переменной.

Кто-нибудь знает, как я могу это сделать?

tomekK
источник
grep -R /usr/lib/x86_64-linux-gnu/libfm ~/.config/fish /usr/share/fish??
Гленн Джекман
$ 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

Ответы:

33

'Fish' способ установки переменной $ 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"а затем положить номера строк на нем с номером строки функционируют, 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
clozach
источник
Примечание: я только что обнаружил, что этот подход не удалит путь, добавленный через какой-то другой механизм; Некоторая очистка точечного файла может быть в порядке, если вы находите путь, возвращающийся каждый раз, когда открываете новый сеанс терминала.
клозах
Это здорово, только что добавили в мой местный!
Элайджа Линн
3

Это должно стереть пути 6 до последнего пути:

set -e PATH[6..-1]

Флаг -e стирается. См help set.

alxrsngrtn
источник
это будет работать только для текущей сессии
Даниэль