$ PATH让我发疯


10

好的,抱歉,这有点愚蠢,但我的想法已经用完了。

目标:预先考虑/usr/local/bin$PATH

问题: $PATH不会做我想要或期望的事情

我如何到达这里:我想开始学习编程,所以我很容易在引擎盖下闲逛,但经验不足。我使用安装了fishshell(因为它很友好!)homebrew,并将其设置为我的默认shell(在之下system prefs>users & groups>advanced)。在某个时候,我跑来brew doctor查看我的安装是否全部符合犹太标准,并且建议我移至/usr/local/bin该版本的开头,$PATH以便可以使用安装的git而不是系统副本。很好-但是在path_helper和之间fish,发生了一些事情,$PATH这是我无法控制的,而且我永远无法以正确的方式安排路径。

环境: OSX 10.8.2,从10.7ish升级,与xcode和安装devtools,加x11homebrewfish

更多信息:我已经把我的用户的默认外壳回bash,并尝试了各种炮弹的直通terminal.app- ,bash,。fish sh我移到/usr/local/bin的顶部,/etc/paths但没有任何改变。我浏览了各种config.fish文件,并注释掉可能与$ PATH混淆的东西,但没有帮助。我在以下文件中/etc/paths.d/

./10-homebrew 包含 /usr/local/bin

./20-fish 包含 /usr/local/Cellar/fish/1.23.1/bin

./40-XQuartz 包含 /opt/X11/bin

我添加set +x到我的游戏中profile,当我开始时terminal.app得到:

Last login: Mon Oct  1 13:31:06 on ttys000
+ '[' -x /usr/libexec/path_helper ']'
+ eval '/usr/libexec/path_helper -s'
++ /usr/libexec/path_helper -s PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/Cellar/fish/1.23.1/bin:/opt/X11/bin";
export PATH;
+ '[' /bin/bash '!=' no ']'
+ '[' -r /etc/bashrc ']'
+ . /etc/bashrc
++ '[' -z '\s-\v\$ ' ']'
++ PS1='\h:\W \u\$ '
++ shopt -s checkwinsize
++ '[' Apple_Terminal == Apple_Terminal ']'
++ '[' -z '' ']'
++ PROMPT_COMMAND='update_terminal_cwd; '
++ update_terminal_cwd
++ local 'SEARCH= '
++ local REPLACE=%20
++ local PWD_URL=file://Chriss-iMac.local/Users/c4
++ printf '\e]7;%s\a' file://Chriss-iMac.local/Users/c4 
Chriss-iMac:~ c4$

因此,看起来path_helper正在运行,但随后运行使echo $PATH我净血/usr/bin:/bin:/usr/sbin:/sbin。所以,看起来好像path_helper根本就没有做应该做的事情吗?

我确定这里存在一些我不理解的明确定义的行为,或者我在尝试修复它时感到厌烦。请帮忙!


请注意,fish通过~/.config/fish/config.fish使用with 可以使它起作用,set PATH /usr/local/bin $PATH但仍然存在一个问题,即path_helper显然不能正常工作,$PATH因此不够完善。也仍然存在$PATH脚本,从GUI启动的应用等不同的问题
。– Chris4d 2012年

Answers:


5

解:

选择是要系统范围的设置还是用户配置并编辑适当的配置文件,请不要将path_helper与fish一起使用。

更多

fish不会提供/ etc / profile的信息,对于系统范围和用户配置,它将分别读取/etc/fish/config.fish和〜/ .config / fish / config.fish [1]。

path_helper旨在用于源于系统范围的配置文件(sh,csh及其派生文件)的shell。由于10.7 path_helper似乎遵循/ etc / paths中的顺序,因此AFAIR并不遵循10.6中的顺序,这很难解决。

如果您真的想将path_helper与fish一起使用,则需要解析其输出,因为它仅提供带有-s-c选项的sh和csh语法。

就像是

/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g'

应该做的工作:

[1] http://ridiculousfish.com/shell/user_doc/html/index.html#initialization


大!这就是我现在所拥有的:if status --is-login eval (/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g') end-在fish 2和Mac OS 10.8.3上可以正常工作
topskip

3

我对/etc/paths.d、path_helper和&c完全一无所知,在我看来,所有这些似乎都给我带来了太多麻烦,但是〜/ .bashrc末尾的以下内容应该使您正确:

 PATH=/usr/local/bin:$PATH

希望这可以帮助!


谢谢Aaron- path_helper是OSX特定的实用程序,应该$PATH通过从中读取/etc/paths,然后在进行登录/etc/paths.d/*。无论如何,我知道您的建议应该可以解决我的问题bash,但实际上我希望它能在fish整个系统中正常运行(如果期望不高的话)。
Chris4d 2012年

啊-对不起。我自己不是OS X用户,更可惜,但是经过一番Google的抨击,看来这个 Stack Overflow问题可能更像是您所追求的-再次说,我不是OS X用户本人,之所以做出回应,是因为快速浏览(粗心大意)您的问题使我觉得您只对bash感兴趣,因此请在这里多加些盐。希望能有所帮助
亚伦·米勒

3

感谢Aaron的响应以及所有在stackexchange网站上回答了其他类似问题的人。为了后代,这是我想出的:

  1. path_helper/etc/profile由语法从调用eval '/usr/libexec/path_helper -s'(实际上,撇号实际上是反引号)。像一个虚拟人一样,我不知道反引号的工作原理,因此出于某种原因将其改为引号。这使我profile无法加载path_helper。更换了反勾号,现在它可以正常工作了(当然)。
  2. set PATH /usr/local/bin $PATH在我~/.config/fish/profile.fish的命令中使用可以确保在首选的shell中获得正确的顺序,但是只要path_helper可行,它就可能是多余的。
  3. 为了确保完整$PATH内容可用于脚本,GUI应用程序等,这似乎是一种折腾,launchd.confenvironment.plist...仍在研究之中。

1
前几天,我读过(但我不记得源代码),10.8不再提供确保所有应用程序可见的路径的可靠方法。我特别记得,environment.plist不再被读取;我隐约知道launchd.conf,因此可能有用,但我认为文章建议不要这样做。
echristopherson

1
更多后续行动:path_helper似乎根本无法在鱼中工作;它输出csh或bash语法,两者都不兼容。相反,您可以使用〜/ .config / fish / config.fish(fish启动脚本)添加目录/etc/paths.d/*并将其附加到$ PATH。希望能帮助到某人!
Chris4d

你还读我的答案吗?它已经存在了
距离
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.