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.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
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
.并且因为它是持久的,所以路径保持在$PATH
shell重启.
它比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)
笔记
在该页面上,作者给出了示例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
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
在添加目录之前,应该有一些方法来检查目录是否已经存在.
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)
似乎fish
不会将不存在的目录路径添加到 PATH 中。这也适用于相对路径。bin
但是,如果您在主目录中创建目录set PATH ./bin $PATH
,则每次启动时都会正常工作,因为它是从主目录执行的。但这是一种黑客行为。
归档时间: |
|
查看次数: |
23353 次 |
最近记录: |