$ PATH está me deixando louco

10

OK, desculpas se isso é algo idiota, mas estou ficando sem ideias.

Objetivo: pré-adicionar /usr/local/bin a $PATH

Problema: $PATH não faz o que eu quero ou espera

Como cheguei aqui: Eu quero começar a aprender a programar, então estou me sentindo confortável, mas não tenho muita experiência. Eu instalei o fish shell (porque é amigável!) Usando homebrew e o configurei como meu shell padrão (em system prefs>users & groups>advanced ). Em algum momento, executei brew doctor para ver se minhas instalações eram todas kosher e sugeri mover /usr/local/bin para a frente de $PATH , para que eu pudesse usar minha instalação de git em vez da cópia do sistema. Tudo bem - mas entre path_helper e fish , algo estava acontecendo com $PATH que estava fora do meu controle, e eu nunca consegui organizar os caminhos da maneira certa.

Ambiente: OSX 10.8.2, atualizado de 10.7ish, com xcode e devtools instalados, além de x11 , homebrew e fish

Mais informações: configurei o shell padrão de meu usuário de volta para bash e experimentei uma variedade de shells através de terminal.app - bash , fish , sh . Mudei /usr/local/bin para o topo de /etc/paths , mas isso não mudou nada. Eu olhei através dos vários arquivos config.fish e comentei coisas que podem mexer com o $ PATH, não ajudou. Eu tenho os seguintes arquivos em /etc/paths.d/ :

./10-homebrew contendo /usr/local/bin

./20-fish contendo /usr/local/Cellar/fish/1.23.1/bin

./40-XQuartz contendo /opt/X11/bin

Eu adicionei set +x ao meu profile e quando eu inicio terminal.app eu recebo:

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$

Portanto, parece que o path_helper é executado, mas a execução de echo $PATH faz com que eu seja /usr/bin:/bin:/usr/sbin:/sbin . Então, parece que path_helper não está mais fazendo o que é suposto?

Tenho certeza de que há algum comportamento bem definido aqui que não entendo, ou borked algo ao tentar corrigi-lo. Por favor ajude!

    
por Chris4d 01.10.2012 / 23:03

3 respostas

3

Obrigado a Aaron por responder e a todos aqueles que responderam outras perguntas semelhantes nos sites do stackexchange. Para a posteridade, aqui está o que eu descobri:

  1. path_helper é chamado de /etc/profile , pela sintaxe eval '/usr/libexec/path_helper -s' (em que os apóstrofos são realmente backticks). Como um manequim, eu não sabia como os backticks funcionavam, e os havia mudado para aspas por algum motivo. Isso quebrou meu profile do carregamento de path_helper . Substituiu os carrapatos e agora funciona como deveria (é claro).
  2. usar set PATH /usr/local/bin $PATH no meu ~/.config/fish/profile.fish garante que eu receba a ordem correta no meu shell preferido, mas contanto que path_helper funcione, ela pode ser redundante.
  3. Para garantir que o $PATH completo esteja disponível para scripts, aplicativos de GUI, etc., parece ser uma disputa entre launchd.conf e environment.plist ... ainda pesquisando esse.
por 02.10.2012 / 06:28
5

solução:

escolha se você deseja que uma configuração do sistema ou um usuário configure e edite o arquivo de configuração apropriado, não use path_helper com peixes.

mais

fish não fornece o arquivo / etc / profile, para o sistema inteiro e configuração do usuário ele irá ler /etc/fish/config.fish e ~ / .config / fish / config.fish respectivamente [1].

path_helper é usado para shells que originam um arquivo de perfil do sistema (sh, csh e suas derivadas). Como 10,7 path_helper parece honrar a ordem em / etc / paths, a AFAIR não o fez em 10.6 e isso foi mais difícil de lidar.

Se você realmente quiser usar o path_helper com peixes, precisará analisar sua saída, pois ele só fornecerá a sintaxe sh e csh com -s e -c opções.

Algo como

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

deve fazer o trabalho:

[1] link

    
por 04.11.2012 / 11:20
3

Eu não tenho absolutamente nenhuma idéia sobre /etc/paths.d, path_helper, & c., todos os quais parecem complicações excessivas para mim, mas o seguinte no final do seu ~ / .bashrc deve colocá-lo corretamente:

 PATH=/usr/local/bin:$PATH

Espero que isso ajude!

    
por 01.10.2012 / 23:10