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

Sim*_*tsa 34 macos shell environment-variables fish

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

echo $PATH
set PATH ./bin $PATH
echo $PATH
Run Code Online (Sandbox Code Playgroud)

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

如果我打开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
Run Code Online (Sandbox Code Playgroud)

我在OS X Lion上运行鱼1.23.1.

Den*_*nis 60

我发现持久添加路径$PATH的最好方法是

set -U fish_user_paths $fish_user_paths ~/path/name
Run Code Online (Sandbox Code Playgroud)

预示$PATH.并且因为它是持久的,所以路径保持在$PATHshell重启.

它比config.fish修改你的命令更有效$PATH,因为它比每次重启shell时运行一次只运行一次.

该变量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
Run Code Online (Sandbox Code Playgroud)

并将其用作:

$ add_to_path foo bar  # Adds foo/ and bar/ to your PATH
Run Code Online (Sandbox Code Playgroud)

笔记

  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


Kei*_*son 16

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

它看起来set PATH dir-name $PATH是预先添加目录的正确语法$PATH.

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

改为使用绝对路径:

set PATH $PWD/bin $PATH
Run Code Online (Sandbox Code Playgroud)

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

至于" set: Value too large to be stored in data type"消息,你可以$PATH多次添加目录吗?$PATH在添加目录之前,应该有一些方法来检查目录是否已经存在.

  • 我会说这是一个坏主意,出于同样的原因,你的`$ PATH`中的`.`是一个坏主意.假设你``cd`到`/ tmp/bad`,有人创建了一个运行`rm -rf $ HOME`的`/ tmp/bad/bin/ls`.如果我知道我想要执行`./ bin`中的命令,我可以输入`bin/whatever`; 如果我不这样做,我可能不想执行它.但是如果你坚持,看起来`fish`只会在运行`set`命令时检查目录是否存在.在设置`$ PATH`时,确保你所在的目录中有一个`./bin`子目录; 当你"cd"到其他目录时它会留在那里. (9认同)

dha*_*rdy 10

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

if status --is-interactive
    set PATH $PATH ~/.local/bin;
end
Run Code Online (Sandbox Code Playgroud)


小智 5

direnv http://direnv.net/是一个很好的工具,可以帮助您正在做的事情.

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

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

$ cd my_project
direnv: loading .envrc
direnv export: ~PATH
Run Code Online (Sandbox Code Playgroud)


Sim*_*tsa 2

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