$ PATH me rend fou

10

OK, je m'excuse si c'est quelque chose de stupide, mais je suis à court d'idées.

Objectif: ajouter /usr/local/binà$PATH

Problème: $PATH ne fera pas ce que je veux ou ce que j'attends

Comment je suis arrivé ici: je veux commencer à apprendre à programmer, donc je suis à l'aise de jouer sous le capot, mais je n'ai pas beaucoup d'expérience. J'ai installé le fishshell (car il est convivial!) En l'utilisant homebrewet le définissant comme mon shell par défaut (en dessous system prefs>users & groups>advanced). À un moment donné, j'ai couru brew doctorpour voir si mes installations étaient toutes casher, et cela m'a suggéré de passer /usr/local/binà l'avant de $PATHsorte que je puisse utiliser mon installation de gitplutôt que la copie système. Très bien - mais entre path_helperet fish, quelque chose se passait $PATHhors de mon contrôle, et je ne pourrais jamais obtenir les chemins arrangés de la bonne manière.

Environnement: Mac OS X 10.8.2, mis à jour à partir 10.7ish, avec xcodeet devtools installé, plus x11, homebrewetfish

Plus d' infos: J'ai mis dos shell par défaut de mon utilisateur bash, et a essayé une variété de coquillages à travers terminal.app- bash, fish, sh. Je me suis déplacé /usr/local/binau sommet de /etc/pathsmais cela n'a rien changé. J'ai regardé à travers les différents config.fishfichiers et commenté des trucs qui pourraient jouer avec $ PATH, n'a pas aidé. J'ai les fichiers suivants dans /etc/paths.d/:

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

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

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

J'ai ajouté set +xà mon profileet quand je commence, terminal.appje reçois:

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$

Il semble donc que path_helper s'exécute, mais ensuite l'exécution echo $PATHme met en réseau /usr/bin:/bin:/usr/sbin:/sbin. Donc, on dirait qu'il path_helperne fait même plus ce qu'il est censé faire?

Je suis sûr qu'il y a un comportement bien défini ici que je ne comprends pas, ou j'ai falsifié quelque chose en essayant de le réparer. Aidez-moi!

Chris4d
la source
Remarque, je peux le faire fonctionner fishen créant ~/.config/fish/config.fishavec set PATH /usr/local/bin $PATHmais j'ai toujours le problème de path_helperne pas fonctionner comme il se doit et $PATHdonc d'être incomplet. Ont également toujours le problème de différents $PATHpour les scripts, les applications démarrées à partir de l'interface graphique, etc.
Chris4d

Réponses:

5

Solution:

choisissez si vous voulez un paramètre à l'échelle du système ou une configuration utilisateur et éditez le fichier de configuration approprié, n'utilisez pas path_helper avec fish.

plus

fish ne source pas / etc / profile, pour le système et la configuration utilisateur, il lira respectivement /etc/fish/config.fish et ~ / .config / fish / config.fish [1].

path_helper est destiné à être utilisé pour les shells qui source un fichier de profil à l'échelle du système (sh, csh et leurs dérivés). Puisque 10.7 path_helper semble honorer l'ordre dans / etc / chemins, AFAIR ne l'a pas fait dans 10.6 et c'était plus difficile à gérer.

Si vous voulez vraiment utiliser path_helper avec fish, vous devrez analyser sa sortie car elle ne fournira que la syntaxe sh et csh avec les options -s et -c .

Quelque chose comme

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

devrait faire le travail:

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

anddam
la source
Génial! Voici ce que j'ai maintenant: if status --is-login eval (/usr/libexec/path_helper -c | sed -e 's/setenv/set -x/' -e 's/:/ /g' -e 's/[";]//g') end- fonctionne bien ici avec fish 2 et Mac OS 10.8.3
topskip
3

Je n'ai absolument aucune idée de /etc/paths.d, path_helper, & c., Qui me semblent tous être des complications excessives, mais ce qui suit à la fin de votre ~ / .bashrc devrait vous donner raison:

 PATH=/usr/local/bin:$PATH

J'espère que cela t'aides!

Aaron Miller
la source
Merci Aaron - path_helperest un utilitaire spécifique à OSX qui se définit soi-disant $PATHlors de la connexion en lisant /etc/pathspuis /etc/paths.d/*. Quoi qu'il en soit, je comprends que votre suggestion devrait me corriger bash, mais je veux vraiment qu'elle fonctionne fish(et de manière cohérente dans tout le système, si ce n'est pas trop à attendre).
Chris4d
Ah - désolé pour ça. Je ne suis pas moi-même un utilisateur d'OS X, plus dommage, mais d'un peu de dénigrement de Google, il semble que cette question de débordement de pile pourrait ressembler davantage à ce que vous recherchez - cela dit, encore une fois, je ne suis pas un Utilisateur d'OS X moi-même, et n'y a répondu que parce qu'un coup d'œil rapide (lire: imprudent) à votre question m'a fait penser que vous n'étiez intéressé que par bash, alors suivez mes conseils ici avec plusieurs grains de sel. J'espère que ça aide tout de même -
Aaron Miller
3

Merci à Aaron d'avoir répondu et à tous ceux qui ont répondu à d'autres questions similaires sur les sites stackexchange. Pour l'amour de la postérité, voici ce que j'ai compris:

  1. path_helperest appelé depuis /etc/profile, par la syntaxe eval '/usr/libexec/path_helper -s'(où les apostrophes sont en fait des backticks). Comme un mannequin, je ne savais pas comment les backticks fonctionnaient, et je les avais donc changés en citations pour une raison quelconque. Cela m'a profileempêché de charger path_helper. Remplacé les tiques arrière et maintenant cela fonctionne comme il se doit (bien sûr).
  2. utiliser set PATH /usr/local/bin $PATHdans mon ~/.config/fish/profile.fishgarantit que j'obtiens le bon ordre dans mon shell préféré, mais tant qu'il path_helperfonctionne, il peut être redondant.
  3. Pour s'assurer que l'intégralité $PATHest disponible pour les scripts, les applications GUI, etc., il semble que ce soit un mélange entre launchd.confet environment.plist... toujours en recherche.
Chris4d
la source
1
J'ai lu l'autre jour (mais je ne me souviens pas de la source) que 10.8 n'offre plus un moyen infaillible d'obtenir un chemin visible pour toutes les applications. Je me souviens en particulier que environment.plist n'est plus lu; Je suis vaguement au courant de launchd.conf, donc cela pourrait fonctionner, mais je pense que l'article a suggéré qu'il ne le serait pas.
echristopherson
1
plus de suivi: il ne semble pas que path_helper fonctionne du tout chez les poissons; il génère la syntaxe csh ou bash, toutes deux incompatibles. À la place, vous pouvez utiliser ~ / .config / fish / config.fish (le script de démarrage de fish) pour cat /etc/paths.d/* et les ajouter à $ PATH. J'espère que cela aide quelqu'un!
Chris4d
avez-vous même lu ma réponse? il est là depuis quatre mois avant votre suivi
anddam