Як видалити шлях із змінної $ 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??
glenn jackman

$ 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

"Рибний" спосіб встановлення змінної $ PATH - це фактично використовувати set --universal fish_user_paths $fish_user_paths /new/path/here. Тоді $ fish_user_paths насправді є претендентом на змінну $ PATH, коли починається новий сеанс. $ PATH документація в даний час не розкаже вам , як видалити його , хоча.

У рибі кожна змінна насправді є списком (масивом), і ви можете зручно отримати доступ до кожного елемента безпосередньо, використовуючи індекс / індекс. 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 і не опинилися тут? Ну добре ..
Pär Nils Amsen

Я думаю, якщо ми візьмемо відповідь @ clozach тут superuser.com/a/1212305/30982 , яка є функцією addpaths () і removepath (), і відкриємо PR, то це був би перший крок до її додавання. Більшість обслуговуючого персоналу досить добре працювати, один здається мені бурхливим, але в цілому, я думаю, ми мали б хороший шанс. Отже, це наш наступний крок.
Ілля Лінн

9

Як каже Ілля, найкраща практика - це модифікація, fish_user_pathsа не глобальна 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

Примітка. Я щойно виявив, що такий підхід не видалить шлях, який додається через якийсь інший механізм; Деяке очищення точкових файлів може бути в порядку, якщо ви знайдете шлях, який повертається кожного разу, коли ви відкриваєте новий сеанс терміналу.
clozach

Це чудово, щойно додане до моїх місцевих!
Ілля Лінн

3

Це має стерти шляхи 6 через останній шлях:

set -e PATH[6..-1]

Прапор -e стирається. Див help set.


це буде працювати лише для поточної сесії
Даніель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.