Вопрос или проблема
Чтобы добавить что-то в $PATH в fish, я использую
fish_add_path -a ~/foo/bar
Затем fish добавляет ~/foo/bar
в мой ~/.config/fish/fish_variables
:
SETUVAR fish_user_paths:/Users/john/foo/bar
Затем, верно ли утверждение, что для удаления /Users/john/foo/bar
из $PATH, у меня есть два варианта:
-
отредактировать файл
fish_variables
-
использовать следующую функцию:
// https://github.com/fish-shell/fish-shell/issues/8604#issuecomment-1169638533 function remove_path if set -l index (contains -i "$argv" $fish_user_paths) set -e fish_user_paths[$index] echo "Removed $argv from the path" end end
И вторая часть вопроса: Как правильно использовать эту функцию? Я сохранил ее как remove_from_path.fish
, запускал как remove_from_path.fish "/Users/john/foo/bar"
, но это, кажется, не удаляет /Users/john/foo/bar
из $PATH. Что я делаю не так?
Я сохранил это как remove_from_path.fish, запускал как remove_from_path.fish “/Users/john/foo/bar”
Если вы сохраните это как скрипт, fish выполнит этот файл, определит функцию, а затем ничего не сделает.
Обычно вы сохраните это как функцию fish – либо поместите в свой ~/.config/fish/config.fish
, либо сохраните как отдельный файл в ~/.config/fish/functions/remove_path.fish
(имя должно совпадать с именем функции!), а затем запускаете просто как
remove_path /Users/john/foo/bar
без “.fish”. С этим fish знает функцию и вызывает её.
Или, если вы хотите использовать скриптовый файл, вы можете вызвать функцию внутри:
function remove_path
# код здесь
end
# Теперь вызываем функцию, которую только что определили:
remove_path $argv
Это запустит второй экземпляр fish, который затем удалит путь. Это работает, потому что универсальные переменные общие для всех экземпляров fish, но немного глупо.
Ответ или решение
Теория
В операционной системе UNIX и ее производных, таких как macOS и Linux, переменная окружения PATH играет ключевую роль в поиске исполняемых файлов, которые запускаются из оболочки. PATH — это список директорий, которые система обходит, чтобы найти нужный исполняемый файл, когда пользователь вводит команду в терминале. Fish-шелл, известный своей интуитивностью и гибкостью, предоставляет пользовательские настройки для управления PATH через свои собственные механизмы, например, с использованием переменной окружения fish_user_paths
.
Когда вы добавляете путь к $PATH
в fish, используя команду fish_add_path -a ~/foo/bar
, этот путь записывается в файл ~/.config/fish/fish_variables
. Это позволяет fish-шеллу сохранять и восстанавливать пользовательские изменения между сеансами.
Удаление пути из переменной PATH в fish может быть выполнено несколькими способами. Первый — это ручное редактирование файла fish_variables
, где вы вручную удаляете строку, содержащую ненужный путь. Второй способ — написание функции, которая автоматизирует этот процесс.
Пример
В вашем примере вы создали функцию remove_path
, которая должна удалять указанный путь из переменной PATH. Вот исходный код функции:
function remove_path
if set -l index (contains -i "$argv" $fish_user_paths)
set -e fish_user_paths[$index]
echo "Removed $argv from the path"
end
end
Эта функция проверяет, содержится ли указанный путь в переменной fish_user_paths
, и удаляет его, если он присутствует. Однако важным моментом является то, как и где объявлена и вызывается эта функция.
Применение
Чтобы функция remove_path
правильно работала, следуйте следующим шагам:
-
Сохраните функцию как fish-функцию:
- Создайте файл с именем, совпадающим с именем функции, например,
remove_path.fish
, и сохраните его в директорию~/.config/fish/functions/
.
- Создайте файл с именем, совпадающим с именем функции, например,
-
Содержимое файла должно быть следующим:
function remove_path if set -l index (contains -i "$argv" $fish_user_paths) set -e fish_user_paths[$index] echo "Removed $argv from the path" end end
-
Запустите функцию:
- После сохранения файла вы можете вызвать функцию из командной строки fish, просто введя
remove_path /Users/john/foo/bar
.
- После сохранения файла вы можете вызвать функцию из командной строки fish, просто введя
Таким образом, при сохранении функции в директории ~/.config/fish/functions/
, fish автоматически распознает и загрузит ее. Вызывая remove_path /Users/john/foo/bar
, вы передаете путь в качестве аргумента к функции, который затем удаляется из списка путей.
Дополнительные рекомендации
-
Проверка результата: Убедитесь, что вы видите сообщение
"Removed /Users/john/foo/bar from the path"
после выполнения функции, что свидетельствует об успешном удалении. -
Резервное копирование: Перед любыми изменениями в конфигурационных файлах лучше всего сделать резервную копию, чтобы можно было быстро восстановить систему в случае ошибки.
-
Обработка нескольких путей: Если вы планируете часто удалять несколько путей, можно доработать функцию, чтобы она принимала несколько аргументов и обрабатывала каждый из них в цикле.
-
Обновление сессий: После удаления пути из
fish_user_paths
, новые сеансы fish будут иметь обновлённый PATH, однако открытые сессии могут его не обновить автоматически. Для обновления PATH можно ввести командуsource ~/.config/fish/config.fish
в активных сеансах.
Заключение
Управление путями в PATH в fish-шелле — важная задача, особенно когда идет речь о поддержке порядка и чистоты в ваших пользовательских и системных конфигурациях. Написание собственной функции для автоматизации удаления путей из PATH не только экономит время, но и уменьшает риск человеческих ошибок при редактировании конфигурационных файлов вручную. Использовать fish-специфичные переменные и механизмы управления путями может показаться сложным на первый взгляд, но это значительно увеличивает гибкость и удобство управления вашими разработческими или системными окружениями.