在鱼类启动时添加$ PATH的相对路径

时间:2011-08-15 10:45:22

标签: macos shell environment-variables fish

我想在fish启动时将./bin目录(相对于当前的shell目录)添加到$ PATH。请注意,fish是一个shell。

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

如果我将这些行放在~/.config/fish/config.fish内,shell将回显相同的路径集合。正确添加绝对路径。

如果我打开shell并在包含set PATH ./bin $PATH的某个目录中键入相同的bin,则会成功添加。但是当当前目录中没有bin时,它会显示错误。

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

我在OS X Lion上运行鱼1.23.1。

5 个答案:

答案 0 :(得分:59)

我发现持续添加$PATH 路径的最佳方法是

set -U fish_user_paths $fish_user_paths ~/path/name

预先$PATH。由于它是持久的,因此路径在shell重启时保持$PATH

比在config.fish中添加命令来修改$PATH更有效,因为与每次重启shell时运行相比,它只运行一次。

变量fish_user_paths is intended to be set by the user 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. 我的dotfiles包含稍高级的版本,可以跳过添加重复项https://github.com/dideler/dotfiles/blob/master/.config/fish/functions/add_to_user_path.fish

答案 1 :(得分:15)

在此之前我从未听说过fish。我刚刚安装了它,所以我可以尝试一下(并删除了我在这里写过的几段,然后才意识到fish是一个shell)。

看起来set PATH dir-name $PATH是将目录添加到$PATH的正确语法。

但是将相对目录名称添加到$PATH几乎肯定是一个坏主意,并且当目录不存在时,你的shell会通过警告你帮忙。 (fish旨在方便用户使用。)

改为使用绝对路径:

set PATH $PWD/bin $PATH

并首先检查$PWD/bin是否存在,如果没有则打印错误消息。

对于“set: Value too large to be stored in data type”消息,您是否可以多次将目录添加到$PATH?在添加目录之前,应该有一些方法可以检查目录是否已经在$PATH

答案 2 :(得分:10)

我认为答案是使用set -U是一个红鲱鱼。而是将以下内容添加到~/.config/fish/config.fish

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

答案 3 :(得分:5)

direnv http://direnv.net/是一个很好的实用程序,可以帮助您正在做的事情。

通常,使用./bin前置$ PATH是不安全的,因为任何对共享目录具有写访问权限的人都可以隐藏恶意代码。 ./bin/ls。当您在共享目录中运行ls时,将执行该代码。

direnv没有解决这个问题(它基于.envrc文件工作,但是任何人都可以放置它们),但至少它会让你知道当你进入$ PATH被修改的目录时:

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

答案 4 :(得分:2)

似乎fish不会向PATH添加不存在的目录路径。这也适用于相对路径。但是,如果您在主目录中创建bin目录,set PATH ./bin $PATH将在每次启动时正常工作,因为它在家中执行。这有点像黑客。