$ PATH está me deixando louco

10

OK, desculpas se isso é algo estúpido, mas estou ficando sem ideias.

Objetivo: anexar /usr/local/bina$PATH

Problema: $PATH não farei o que quero ou espero

Como cheguei aqui: quero começar a aprender a programar, por isso estou me sentindo confortável brincando sob o capô, mas não tenho muita experiência. Eu instalei o fishshell (porque é amigável!) Usando homebrewe o defini como meu shell padrão (abaixo system prefs>users & groups>advanced). Em algum momento, corri brew doctorpara ver se minhas instalações eram todas kosher e sugeri que eu fosse /usr/local/binpara a frente $PATHpara que eu pudesse usar minha instalação gitem vez da cópia do sistema. Tudo bem - mas entre path_helpere fish, algo estava acontecendo com $PATHisso estava fora do meu controle, e eu nunca conseguia organizar os caminhos da maneira certa.

Ambiente: OSX 10.8.2, atualizado a partir 10.7ish, com xcodee devtools instalado, além de x11, homebrewefish

Mais informações: eu definir shell default costas do meu usuário bash, e tentou uma variedade de conchas através terminal.app- bash, fish, sh. Eu mudei /usr/local/binpara o topo, /etc/pathsmas não mudou nada. Eu olhei através dos vários config.fisharquivos e comentei coisas que poderiam mexer com $ PATH, não ajudaram. 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 +xao meu profilee, quando começo terminal.app, 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 corre path_helper, mas em seguida, executando echo $PATHredes de me /usr/bin:/bin:/usr/sbin:/sbin. Então, parece que path_helpernem está mais fazendo o que deveria?

Tenho certeza de que existe algum comportamento bem definido aqui que não entendo ou quebrei algo enquanto tentava corrigi-lo. Por favor ajude!

Chris4d
fonte
note que posso trabalhar fishcom isso criando ~/.config/fish/config.fishcom, set PATH /usr/local/bin $PATHmas ainda tenho o problema de path_helperaparentemente não funcionar como deveria e, $PATHportanto, estar incompleto. Também tem a questão de diferente $PATHpara scripts, aplicativos iniciados na GUI etc.
Chris4d 1/12

Respostas:

5

solução:

escolha se deseja uma configuração para todo o sistema ou uma configuração do usuário e edite o arquivo de configuração apropriado, não use path_helper com o fish.

Mais

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

path_helper destina-se ao uso de shells que originam um arquivo de perfil amplo do sistema (sh, csh e seus derivados). Como o 10.7 path_helper parece honrar a ordem no / etc / caminhos, o AFAIR não o fez na 10.6 e isso foi mais difícil de lidar.

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

Algo como

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

deve fazer o trabalho:

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

anddam
fonte
Ótimo! Isto é o que eu tenho agora: if status --is-login eval (/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g') end- funciona bem aqui com peixes 2 e Mac OS 10.8.3
topskip
3

Não tenho absolutamente nenhuma idéia sobre o /etc/paths.d, path_helper, etc., todos os quais parecem complicações excessivas para mim, mas o seguinte no final do seu ~ / .bashrc deve te acertar:

 PATH=/usr/local/bin:$PATH

Espero que isto ajude!

Aaron Miller
fonte
Obrigado Aaron - path_helperé um utilitário específico para OSX que supostamente define o $PATHlogin lendo /etc/pathse depois /etc/paths.d/*. De qualquer forma, entendo que sua sugestão deve ser corrigida bash, mas eu realmente quero que ela funcione fish(e de forma consistente em todo o sistema, se não houver muito o que esperar).
31412 Chris4d
Ah - desculpe por isso. Eu não sou um usuário do OS X, pena de mais, mas a partir de um pouco de críticas ao Google, parece que essa pergunta sobre o Stack Overflow pode ser mais parecida com o que você procura - e disse, novamente, que eu não sou um Eu próprio usuário do OS X, e só respondi porque um rápido (leia-se: descuidado) sua pergunta me fez pensar que você estava interessado apenas no bash, então siga meu conselho aqui com vários grãos de sal. Espero que ajude, da mesma forma - #
Aaron Miller
3

Agradecemos a Aaron por responder e por todos aqueles que responderam outras perguntas semelhantes nos sites de stackexchange. Por uma questão de posteridade, eis o que eu descobri:

  1. path_helperé chamado from /etc/profile, pela sintaxe eval '/usr/libexec/path_helper -s'(onde os apóstrofos são na verdade backticks). Como um boneco, eu não sabia como funcionavam os backticks e, por algum motivo, os havia mudado para aspas. Isso me impediu profilede carregar path_helper. Substituiu os back-ticks e agora funciona como deveria (é claro).
  2. usando set PATH /usr/local/bin $PATHno meu ~/.config/fish/profile.fishgarante que eu recebo a ordem certa no meu shell preferido, mas enquanto path_helperfunciona, pode ser redundante.
  3. Por garantir que o completo $PATHesteja disponível para scripts, aplicativos da GUI, etc., parece ser um lance entre launchd.confe environment.plist... ainda está pesquisando esse.
Chris4d
fonte
1
Li outro dia (mas não me lembro da fonte) que a 10.8 não oferece mais uma maneira infalível de obter um caminho visível para todos os aplicativos. Lembro-me em particular de que environment.plist não é mais lido; Estou vagamente ciente do launchd.conf, então isso pode funcionar, mas acho que o artigo sugeriu que não.
Echristopherson
1
mais acompanhamento: não parece que path_helper funciona em peixes; ele gera sintaxe csh ou bash, ambas incompatíveis. Em vez disso, você pode usar ~ / .config / fish / config.fish (o script de inicialização do fish) para cat /etc/paths.d/* e anexá-los a $ PATH. Espero que ajude alguém!
Chris4d
você leu minha resposta? está presente há quatro meses antes do seu acompanhamento
anddam