Удалить определенный путь из $PATH

Вопрос или проблема

Чтобы добавить что-то в $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 правильно работала, следуйте следующим шагам:

  1. Сохраните функцию как fish-функцию:

    • Создайте файл с именем, совпадающим с именем функции, например, remove_path.fish, и сохраните его в директорию ~/.config/fish/functions/.
  2. Содержимое файла должно быть следующим:

    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
  3. Запустите функцию:

    • После сохранения файла вы можете вызвать функцию из командной строки fish, просто введя remove_path /Users/john/foo/bar.

Таким образом, при сохранении функции в директории ~/.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-специфичные переменные и механизмы управления путями может показаться сложным на первый взгляд, но это значительно увеличивает гибкость и удобство управления вашими разработческими или системными окружениями.

Оцените материал
Добавить комментарий

Капча загружается...