Подтвердить что ты не робот

Добавить относительный путь к $PATH при запуске рыбы

Я хочу добавить. /bin каталог (который относится к текущей директории оболочки) в $PATH при запуске рыбы. Обратите внимание, что fish является оболочкой.

echo $PATH
set PATH ./bin $PATH
echo $PATH

Если я поместил эти строки внутри ~/.config/fish/config.fish, оболочка будет отображать одну и ту же коллекцию путей. Абсолютные пути добавляются должным образом.

Если я открою оболочку и введите тот же set PATH ./bin $PATH внутри некоторого каталога, содержащего bin, он будет добавлен успешно. Однако, когда в текущем каталоге нет bin, он показывает мне ошибку.

set: Could not add component ./bin to PATH.
set: Value too large to be stored in data type

Я запускаю рыбу 1.23.1 на OS X Lion.

4b9b3361

Ответ 1

Кажется, что fish не добавит несуществующий путь к каталогу PATH. Это относится и к относительным путям. Но если вы создаете каталог bin в своем домашнем каталоге set PATH ./bin $PATH, он будет работать должным образом при каждом запуске, поскольку он выполняется из дома. Однако это своего рода хак.

Ответ 2

Лучший способ найти настойчиво добавить путь к вашему $PATH -

set -U fish_user_paths $fish_user_paths ~/path/name

Это добавляется к $PATH. И поскольку он постоянный, путь остается в $PATH при перезагрузке оболочки.

Это более эффективно, чем использование команды в config.fish для изменения вашего $PATH, потому что он работает только один раз по сравнению с запуском при каждом перезапуске оболочки.

Переменная fish_user_paths предназначена для установки пользователем 1 как указано смешная рыба, хранитель рыбы.


Рассмотрите возможность создания функции рыбы для удобства: 2

# ~/.config/fish/functions/add_to_path.fish
function add_to_path --description 'Persistently prepends paths to your PATH'
  set --universal fish_user_paths $fish_user_paths $argv
end

И используйте его как:

$ add_to_path foo bar  # Adds foo/ and bar/ to your PATH

Примечания

  • На этой странице автор приводит пример set -U fish_user_paths ~/bin. Это перезаписывает fish_user_paths с единственным значением ~/bin. Чтобы избежать потери существующих путей, установленных в fish_user_paths, обязательно добавьте $fish_user_paths в дополнение к новым добавляемым путям (как показано в моем ответе).

  • Мои dotfiles содержат несколько более продвинутую версию, которая пропускает добавление дубликатов https://github.com/dideler/dotfiles/blob/master/.config/fish/functions/add_to_user_path.fish

Ответ 3

Я никогда не слышал о fish до этого. Я только что установил его, чтобы попробовать (и удалил несколько параграфов, которые я написал здесь, прежде чем понять, что fish является оболочкой).

Похоже, что set PATH dir-name $PATH - это правильный синтаксис для добавления каталога в $PATH.

Но добавление относительного имени каталога в $PATH почти наверняка является плохой идеей, и ваша оболочка делает вам одолжение, предупреждая вас, когда каталог не существует. (fish предназначен для удобства использования.)

Вместо этого используйте абсолютный путь:

set PATH $PWD/bin $PATH

и сначала проверьте, существует ли $PWD/bin, печатайте сообщение об ошибке, если это не так.

Что касается сообщения "set: Value too large to be stored in data type", можете ли вы добавить каталог в свой $PATH несколько раз? Должен быть какой-то способ проверить, находится ли каталог уже в $PATH, прежде чем добавлять его.

Ответ 4

Я думаю, что ответ заключается в том, что использование set -U - это красная селедка. Вместо этого добавьте следующее в ~/.config/fish/config.fish:

if status --is-interactive
    set PATH $PATH ~/.local/bin;
end

Ответ 5

direnv http://direnv.net/ - это хорошая утилита, помогающая с тем, что вы делаете.

Как правило, добавление $PATH с. /bin небезопасно, так как любой, имеющий доступ на запись в общий каталог, может скрыть вредоносный код, например.. /bin/ls. Этот код будет выполняться при запуске ls в общем каталоге.

direnv не решает эту проблему (он работает на основе файлов .envrc, но кто-то может их размещать), но по крайней мере это заставляет вас знать, когда вы входите в каталог, который изменяет $PATH:

$ cd my_project
direnv: loading .envrc
direnv export: ~PATH