Добавьте относительный путь к $ PATH при запуске рыбы - PullRequest
34 голосов
/ 15 августа 2011

Я хочу добавить каталог ./bin (относительно текущего каталога оболочки) в $ PATH при запуске fish.Обратите внимание, что 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

Я запускаю fish 1.23.1 на OS X Lion.

Ответы [ 5 ]

59 голосов
/ 15 января 2014

Лучший способ, который я нашел, чтобы постоянно добавлять путь к вашему $PATH, это

set -U fish_user_paths $fish_user_paths ~/path/name

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

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

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


Для удобства рассмотрите возможность создания функции рыбы: 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

Примечания

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

  2. Мои точечные файлы содержат немного более продвинутую версию, которая пропускает добавление дубликатов https://github.com/dideler/dotfiles/blob/master/.config/fish/functions/add_to_user_path.fish

15 голосов
/ 15 августа 2011

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

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

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

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

set PATH $PWD/bin $PATH

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

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

10 голосов
/ 21 апреля 2012

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

if status --is-interactive
    set PATH $PATH ~/.local/bin;
end
5 голосов
/ 29 декабря 2013

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

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

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

$ cd my_project
direnv: loading .envrc
direnv export: ~PATH
2 голосов
/ 15 августа 2011

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

...