Я использую 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 врепос этим примером. Я открыл вопросздесь.
вкратце;
echo $fish_user_paths | tr " " "\n" | nl
// получить номер того, который вы хотите удалить, например, 5-гоset --erase --universal fish_user_paths[5]
// стереть 5-й путь повсеместно, чтобы он сохранялся в новых сеансах
решение2
Как говорит Элайджа, лучше всего изменять , fish_user_paths
а не глобальный PATH
. Чтобы больше никогда не пришлось гуглить это…
- Создайте пару функций, которыетолько изменить
fish_user_paths
- Сделать обе функцииавтозагрузка
Чтобы добавить в пути пользователя:
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