$ PATH mi sta facendo impazzire


10

OK, mi scuso se questo è qualcosa di stupido, ma sto finendo le idee.

Obiettivo: anteporre /usr/local/bina$PATH

Problema: $PATH non farà ciò che voglio o mi aspetto

Come sono arrivato qui: voglio iniziare a imparare a programmare, quindi mi sento a mio agio nel nascondiglio, ma non ho molta esperienza. Ho installato la fishshell (perché è amichevole!) Usando homebrewe impostato come shell predefinita (sotto system prefs>users & groups>advanced). Ad un certo punto, ho corso brew doctorper vedere se le mie installazioni erano tutte kosher, e mi ha suggerito di spostarmi /usr/local/binin primo piano in $PATHmodo da poter usare la mia installazione gitpiuttosto che la copia di sistema. Bene, ma tra path_helpere fish, stava accadendo qualcosa $PATHche era fuori dal mio controllo e non riuscivo mai a organizzare i percorsi nel modo giusto.

Ambiente: OSX 10.8.2, aggiornato da 10.7ish, con xcodee devtools installato, oltre x11, homebrewefish

Per saperne di più: ho arretrato shell di default del mio utente bash, e ha cercato una varietà di conchiglie thru terminal.app- bash, fish, sh. Mi sono spostato /usr/local/binin cima /etc/pathsma non ha cambiato nulla. Ho guardato attraverso i vari config.fishfile e commentato cose che avrebbero potuto rovinare $ PATH, non mi hanno aiutato. Ho i seguenti file in /etc/paths.d/:

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

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

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

Ho aggiunto set +xal mio profilee quando inizio terminal.appottengo:

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$

Quindi sembra che path_helper corra, ma poi echo $PATHmi corre /usr/bin:/bin:/usr/sbin:/sbin. Quindi, sembra che path_helpernon stia nemmeno facendo ciò che dovrebbe più?

Sono sicuro che ci sia un comportamento ben definito qui che non capisco, o ho bloccato qualcosa mentre cercavo di risolverlo. Per favore aiuto!


nota, posso farlo funzionare fishcreando ~/.config/fish/config.fishcon set PATH /usr/local/bin $PATHma ho ancora il problema di path_helperapparentemente non funzionare come dovrebbe, e $PATHquindi essere incompleto. Anche il problema è diverso $PATHper gli script, le app avviate dalla GUI, ecc.
Chris4d,

Risposte:


5

soluzione:

scegliere se si desidera un'impostazione a livello di sistema o una configurazione utente e modificare il file di configurazione appropriato, non utilizzare path_helper con fish.

Di Più

fish non genera / etc / profile, per tutto il sistema e la configurazione dell'utente leggerà rispettivamente /etc/fish/config.fish e ~ / .config / fish / config.fish [1].

path_helper è pensato per l'uso di shell che generano un file di profilo a livello di sistema (sh, csh e loro derivati). Dato che 10.7 path_helper sembra onorare l'ordine in / etc / percorsi, AFAIR non lo ha fatto in 10.6 ed è stato più difficile da affrontare.

Se vuoi davvero usare path_helper con fish dovrai analizzarne l'output poiché fornirà solo la sintassi sh e csh con le opzioni -s e -c .

Qualcosa di simile a

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

dovrebbe fare il lavoro:

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


Grande! Questo è quello che ho adesso: if status --is-login eval (/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g') end- funziona bene qui con il pesce 2 e Mac OS 10.8.3
topskip

3

Non ho assolutamente idea di /etc/paths.d, path_helper, ecc., Che mi sembrano complicazioni eccessive, ma quanto segue alla fine del tuo ~ / .bashrc dovrebbe metterti a posto:

 PATH=/usr/local/bin:$PATH

Spero che questo ti aiuti!


Grazie Aaron - path_helperè un'utilità specifica per OSX che presumibilmente imposta $PATHall'accesso leggendo da /etc/pathse poi /etc/paths.d/*. Ad ogni modo, capisco che il tuo suggerimento dovrebbe risolvermi bash, ma in realtà voglio che funzioni fish(e coerentemente su tutto il sistema, se non è troppo da aspettarsi).
Chris4d,

Ah - scusa per quello. Io stesso non sono un utente OS X, peccato più, ma da un po 'di Google bashing sembra che questa domanda Stack Overflow potrebbe essere più simile a ciò che stai cercando - detto, ancora una volta, non sono un L'utente di OS X me stesso, e ha risposto solo perché una rapida occhiata alla tua domanda mi ha fatto pensare che eri interessato solo a bash, quindi segui il mio consiglio qui con diversi granelli di sale. Spero che sia di aiuto, comunque
Aaron Miller,

3

Grazie ad Aaron per la risposta e per tutti coloro che hanno risposto ad altre domande simili sui siti di stackexchange. Per amor dei posteri, ecco cosa ho capito:

  1. path_helperviene chiamato da /etc/profile, dalla sintassi eval '/usr/libexec/path_helper -s'(dove gli apostrofi sono effettivamente backtick). Come un manichino, non sapevo come funzionassero i backtick e quindi li avevo cambiati in virgolette per qualche motivo. Questo mi ha rotto profiledal caricamento path_helper. Sostituito i segni di spunta e ora funziona come dovrebbe (ovviamente).
  2. l'uso set PATH /usr/local/bin $PATHin my ~/.config/fish/profile.fishassicura che ottenga il giusto ordine nella mia shell preferita, ma finché path_helperfunziona può essere ridondante.
  3. Per garantire che il completo $PATHsia disponibile per gli script, le app della GUI, ecc., Sembra essere un gioco tra launchd.confe environment.plist... ancora alla ricerca di quello.

1
Ho letto solo l'altro giorno (ma non ricordo la fonte) che 10.8 non offre più un modo infallibile per ottenere un percorso visibile a tutte le app. Ricordo in particolare che environment.plist non viene più letto; Sono vagamente consapevole di launchd.conf, quindi potrebbe funzionare, ma penso che l'articolo abbia suggerito che non avrebbe funzionato.
ecristopherson,

1
più follow-up: non sembra che path_helper funzioni affatto nei pesci; produce sintassi csh o bash, entrambe incompatibili. Invece, puoi usare ~ / .config / fish / config.fish (lo script di avvio del pesce) per cat /etc/paths.d/* e aggiungerli a $ PATH. Spero che aiuti qualcuno!
Chris4d,

hai letto la mia risposta? è lì da quattro mesi prima del tuo follow-up
anddam,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.