17

Я использую 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 .

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

3 ответа3

24

Способ '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-й путь, чтобы он сохранялся в новых сеансах
8

Как говорит Илия, лучшая практика - модифицировать 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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .