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)
笔记
在该页面上,作者给出了示例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 次 |
| 最近记录: |