$PATH 让我抓狂

$PATH 让我抓狂

好吧,如果这是愚蠢的想法,我很抱歉,但是我已经没有主意了。

目标:添加/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,另外还有x11homebrewfish

更多信息:我已将用户的默认 shell 重新设置为bash,并尝试了各种 shell terminal.app- bashfishsh。我移至/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 网站上回答其他类似问题的人。为了方便后人,以下是我得出的结论:

  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.conf......environment.plist目前仍在研究这个问题。

相关内容