好吧,如果这是愚蠢的想法,我很抱歉,但是我已经没有主意了。
目标:添加/usr/local/bin
到$PATH
问题: $PATH
不会做我想要或期望的事情
我是如何到达这里的:我想开始学习编程,所以我对在后台乱搞很熟悉,但没有太多经验。我fish
使用 安装了 shell(因为它很友好!)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,另外还有x11
,homebrew
和fish
更多信息:我已将用户的默认 shell 重新设置为bash
,并尝试了各种 shell 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
甚至不再做它应该做的事情了?
我确信这里有一些我不理解的明确定义的行为,或者我在尝试修复它时弄坏了一些东西。请帮忙!
答案1
解决方案:
选择您是否需要系统范围设置或用户配置并编辑适当的配置文件,不要将 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 中的顺序,据我所知,在 10.6 中它不遵守顺序,这更难处理。
如果你真的想将 path_helper 与 fish 一起使用,你需要解析其输出,因为它只提供 sh 和 csh 语法-s和-C选项。
就像是
/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
答案2
我完全不了解 /etc/paths.d、path_helper 等,所有这些对我来说似乎都过于复杂,但是在 ~/.bashrc 末尾的以下内容应该可以让你正确理解:
PATH=/usr/local/bin:$PATH
希望这可以帮助!
答案3
感谢 Aaron 的回复以及所有在 stackexchange 网站上回答其他类似问题的人。为了方便后人,以下是我得出的结论:
path_helper
/etc/profile
按照语法从 调用(eval '/usr/libexec/path_helper -s'
其中撇号实际上是反引号)。像个傻瓜一样,我不知道反引号是如何工作的,所以出于某种原因将它们更改为引号。这使我无法profile
加载path_helper
。替换了反引号,现在它可以正常工作了(当然)。set PATH /usr/local/bin $PATH
在我的使用中~/.config/fish/profile.fish
可以确保我在我喜欢的 shell 中获得正确的顺序,但只要path_helper
有效,它可能是多余的。- 为了确保完整的功能
$PATH
可供脚本、GUI 应用程序等使用,这似乎是一个难题launchd.conf
......environment.plist
目前仍在研究这个问题。