我想在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。
答案 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
注释
在该页面上,作者给出了示例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
答案 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
将在每次启动时正常工作,因为它在家中执行。这有点像黑客。