Disaccordi di Emacs e della riga di comando $ PATH su OSX


18

Problemi con le PATHimpostazioni di Emacs che influenzano il mio ambiente Haskell:

Sto usando ZSH e quando vado dalla riga di comando e chiamo echo $PATH, restituisce:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Questo deriva dalla .zprofileconfigurazione in cui ho:

# Set the list of directories that Zsh searches for programs.
path=(
  ~/Library/Haskell/bin
  /usr/local/{bin,sbin}
  $path
)

Quindi, dalla riga di comando, quando chiamo which cabal, ottengo correttamente:/Users/g/Library/Haskell/bin/cabal

Quando avvio Emacs e vado su shelle chiamo which cabal, ottengo: il /usr/bin/cabalche mi sta causando problemi poiché è una versione diversa.

Quando ispeziono echo $PATHda Emacs shell, vedo:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/g/Library/Haskell/bin:/usr/local/sbin

Non ho idea di come diavolo PATHpossa essere diverso ...

Qualcuno sa come fare in modo che la mia ZSHshell ed Emacs siano d'accordo sullo stesso PATH? Ho il sospetto che sia ciò che controlla da dove cabalviene caricato.

AGGIORNAMENTO : in esecuzione echo $SHELLdalle stampe Emacs:/bin/zsh

AGGIORNAMENTO 2 : Questo è su OSX .

AGGIORNAMENTO 3 : Ho provato a utilizzare il modulo exec-path-from-shell e non funziona. Ho ancora gli stessi problemi e, come effetto collaterale, rovina i colori del mio tema terminale :(

AGGIORNAMENTO 4 : Ho installato Emacs tramite brew install --cocoa --srgb emacsed eseguo emacs collegato in questo modo:

~ ❯❯❯ which emacs
/usr/local/bin/emacs
~ ❯❯❯ l /usr/local/bin/emacs
lrwxr-xr-x  1 g  admin    30B 29 Jan 18:34 /usr/local/bin/emacs -> ../Cellar/emacs/24.4/bin/emacs
~ ❯❯❯ l /usr/local/Cellar/emacs/24.4/bin/emacs
-r-xr-xr-x  1 g  admin    87B 29 Jan 18:34 /usr/local/Cellar/emacs/24.4/bin/emacs

Stai usando ZSH come shell di login?
wasamasa,

Non sono sicuro di cosa significhi esattamente con la shell di login, ma immagino di aver richiamato chsh...in giornata per cambiare la mia shell predefinita
Galder Zamarreño

Sto usando iTerm2 a proposito ...
Galder Zamarreño

2
Apparentemente no, modifica PATH in ~/.profileo /etc/profilepoi.
wasamasa,

1
Impostare le variabili di ambiente in ~/.zshenv, che verranno fornite in modo coerente a prescindere dalla shell avviata (interattiva o non interattiva). Se exec-path-from-shellè rovinare i vostri colori del tema del terminale, è possibile impostare exec-path-from-shell-argumentsper nilprima di chiamare exec-path-from-shell-initializeper assicurarsi che non è in esecuzione le parti interattive del vostro config zsh.
sanityinc,

Risposte:



8

Questo è un fastidioso problema di ambiente OSX, l' $PATHapparizione in Emacs proviene da un /etc/pathsfile, che viene poi aggiunto a tutto ciò che ho impostato nella shell. Ho aggiunto /Users/g/Library/Haskell/binall'inizio del /etc/pathsfile e poi ha funzionato bene.

Andare in shell e chiamare echo $PATHEmacs mostra ora:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin

E cabal'davvero la versione cabal-install version 1.22.2.0: D

Ringrazia tutti!!


Grazie a beOn per i suoi suggerimenti in questo post$PATH su OSX .
Galder Zamarreño,

2
Una soluzione migliore è modificare il percorso in ~/.zshenv. I cambiamenti si riflettono nel PERCORSO di Emacs
Galder Zamarreño,

Posso confermare che semplicemente facendo echo export PATH=$PATH > ~/.zshenvEmacs lo M-x shellraccoglie alla prossima invocazione.
Linus Arver,

5

Se avvii emacs dal tuo ambiente GUI (gnome, kde, ...) i tuoi script di avvio della shell non verranno inviati al tuo ambiente. Quindi $PATHciò che hai impostato con cura nel tuo .zshnon verrà caricato. Gli ambienti con interfaccia grafica non li generano generalmente, sebbene possano caricare il ~/.profilefile.

Puoi provare ad aggiungere questo al tuo .pam_environment:

PATH DEFAULT=${PATH}:/MYHOMEDIR/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin

Sarà necessario riavviare la sessione della GUI per caricarla.

Questo documento potrebbe aiutarti a $PATHimpostare correttamente la tua variabile:

https://help.ubuntu.com/community/EnvironmentVariables#Session-wide_environment_variables

Uso il ~/.pam_environmentfile per gestire le variabili di ambiente di cui ho bisogno per essere accessibile dai miei processi shell o emacs.

PS: un commentatore astuto sottolinea che probabilmente sei su Mac. Non so come impostare la tua $PATHnella GUI del Mac, ma il punto vale ancora per la differenza tra l'ambiente della tua shell e l'ambiente della GUI. Il modo in cui si configura $PATHla GUI sembra dipendere dalla versione del sistema operativo. Tuttavia puoi usare:

(setenv "PATH" (concat (getenv "PATH") ":/foo/bar"))

nel tuo ~/.emacs.d/initse vuoi solo una soluzione che dovrebbe funzionare.

PPS: Se vuoi eseguire una shell in emacs, probabilmente stai meglio usando ansi-termpiuttosto che shell.


Dubito che la domanda riguardi Linux dato che l'interrogatore ha menzionato l'uso di iTerm 2 .
wasamasa,

3

Se una parte del PERCORSO si perde, puoi aggiungerlo nel tuo ~ / .emacs

;;; We add /path/to/something/extra by appending it to the path
(setenv "PATH" (concat (getenv "PATH") ":/path/to/something/extra"))
;;; /path/to/something/extra is now at the end of the PATH.
;;; or you can use:
;(setenv "PATH" (concat "/path/to/something/extra:" (getenv "PATH")))
;;; /path/to/something/extra is now at the beginning of the PATH.

Per evitare problemi PATH, avvio sempre emacs dalla riga di comando con il PATH esportato da ~ / .bashrc.


2

Un altro modo per ottenere ciò è semplicemente dire alla shell che si tratta di una shell di accesso in modo che generi tutti i file giusti. Faccio questo per bash impostando explicit-bash-argssu ("--noediting" "--login"). Sembra che l'equivalente di zsh sia impostato explicit-zsh-argssu ("-l").

Quindi nel mio .emacs:

(setq explicit-bash-args '("--noediting" "--login"))

Nel tuo, qualcosa come:

(setq explicit-zsh-args '("-l"))

Penso che "--noediting"non sia necessario, e non sembra esserci un modo per dirlo a zsh, ma potrebbe essere qualcosa su cui indagare se non funziona come sperate.


1
Funziona con una shell eseguita sotto Emacs. Non funziona per i comandi eseguiti direttamente all'interno di Emacs, come via M-x shell-command.
mernst

1

È inoltre possibile impostare un percorso predefinito a livello di OS X, ad esempio salvando un elenco di proprietà come questo come ~/Library/LaunchAgents/my.startup.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>my.startup</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl setenv PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Il nuovo percorso dovrebbe essere mostrato in shell, Emacs e altre applicazioni dopo aver effettuato il logout e il login.

Questo metodo non modifica il percorso nelle applicazioni che vengono aperte come elementi di accesso o quando le applicazioni vengono riaperte all'accesso dopo un arresto forzato. Se si dispone di Emacs, un'applicazione terminale o altre applicazioni in cui si desidera modificare il percorso negli elementi di accesso, è necessario rimuoverli.

In 10.9 e precedenti puoi anche aggiungere una linea come questa a /etc/launchd.conf:

setenv PATH /usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

Tuttavia, il supporto per è /etc/launchd.confstato rimosso in 10.10.

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.