Добавить относительный путь к $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.
Ответы
Ответ 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