Wie kann ein Terminal / eine Shell, die in Emacs auf einem Mac erzeugt wird, die Umgebungsvariablen des nativen Terminals erben?

7

Das Terminal, das nativ auf einem Mac ausgeführt wird, dh über Spotlight oder Launchpad erzeugt wird, übernimmt die gewünschten Umgebungsvariablen einschließlich der Anpassung in ~/.bash_profile. Aber wenn ich Emacs laufen ( Emacs.appentnommen aus Emacs Für Mac OS X ) und Spawn - Schal im Innern (entweder shell, eshelloder term), die Schalen übernehmen nicht die gleichen Umgebungsvariablen wie bereits erwähnt.

Ich stelle fest , dass die Schale seiner Umgebung aus dem Prozess nimmt , dass startet es und es aus diesem Grund ist , dass die Werte der Umgebungsvariablen der Shell die gleichen wie die von Emac (zB (getenv "PATH"))

Ich wagte mich in den Inhalt von Terminal.appund Emacs.apphatte kein Glück.

Wie kann ich automatisch dieselbe Umgebungsvariable abrufen, die ich Terminal.appin der in Emacs erstellten Shell erhalten habe? Und ich ziehe es nicht vor, Emacs vom Terminal aus zu starten.

(Mir ist klar, dass dies zu MacOSX-artig ist und die Antworten Lösungen / Optimierungen vorschlagen könnten, die völlig außerhalb von Emacs liegen. Aber die Frage betrifft Emacs, deshalb habe ich diese Site gewählt.)

Blutende Finger
quelle
Wenn Sie Emacs.app über ein Terminalfenster starten, sehen Sie die richtigen Umgebungsvariablen?
Melioratus
Auf diese Weise sind die Umgebungsvariablen umfangreicher, entsprechen jedoch nicht denen des Terminals, von dem aus sie gestartet wurden. Die Anpassungen (Aliase usw.) im ~ / .bash_profile werden nicht gelesen. @ Melioratus
Blutende Finger
1
Seltsam. Mein ~/.bash_profilegelesen wird richtig , wenn ich ausführen , Emacs.appwie diese /Applications/Emacs.app/Contents/MacOS/Emacs . &verwendet Terminal.app.
Melioratus
Ich habe nur zweimal überprüft, ob meine Aliase auch funktionieren.
Melioratus

Antworten:

5

Ich habe kürzlich angefangen, Emacs außerhalb des Terminals zu verwenden, was mir einige PATH-Probleme verursachte. Ich hatte versucht, es (getenv "PATH")einzustellen, indem ich es meinem Exec-Pfad hinzufügte , unter anderem, was letztendlich nie funktionierte.

Am Ende habe ich das Paket exec-path-from-shell über melpa installiert. Es funktioniert, indem Sie Ihre $SHELLUmgebungsvariable verwenden, um Ihre Shell aufzufordern, Ihre auszudrucken $PATHund das Ergebnis zu kopieren.

Bearbeiten: Hier ist der Code, den ich benutze

;; I set this at the beginning of my init.el for other mac specific settings
(defconst *is-a-mac* (eq system-type 'darwin))

;; Later on, after loading exec-path-from-shell package
(if *is-a-mac*
    (add-hook 'after-init-hook 'exec-path-from-shell-initialize))
Steven
quelle
1
Bitte beschreiben Sie, wie diese Antwort die Frage beantwortet. Inwiefern hilft die Installation dieses Pakets?
Drew
3

Angesichts des tatsächlichen Titels hier "Wie kann ein Terminal / eine Shell, die in Emacs auf einem Mac erzeugt wird, die Umgebungsvariablen des nativen Terminals erben?" Sie können nicht, da Emacs die Terminal.app auf keiner Ebene als Superprozess hat, sodass Emacs nichts von der Shell in Terminal.app erben kann. Sie müssen die Umgebung gleich gestalten, indem Sie dieselben Dateien beziehen.

Aufbauend auf dieser Antwort auf AskDifferent

Sie müssen die Startdateien für Bash notieren. ~ / .bash_profile wird in einer Login-Shell gelesen ~ / .bashrc, wenn eine andere Shell gestartet wird.

Cocoa Emacs ist eine GUI, und wenn es ausgeführt wird, wird es in einem Unterprozess ausgeführt, in dem nichts eine Anmeldeshell ausgeführt hat, sodass in seiner Umgebung nichts ~ / .bash_profile bezogen hat. Emacs startet eine Nicht-Login-Shell, damit alles in ~ / .bashrc gelesen wird.

Aus diesem Grund wird im Bash-Handbuch empfohlen, dies in ~ /, bash_profile zu haben

if [ -f ~/.bashrc ]; then . ~/.bashrc; fi 

und setzen Sie Ihre Umgebungseinstellungen in ~ / .bashrc

Warum /Applications/Emacs.app/Contents/MacOS/Emacs. arbeitet im Terminal. Terminal.app führt standardmäßig eine Shell im Anmeldemodus aus, sodass die Shell ~ / .bash_profile bezogen hat und emacs ein Unterprozess dieser Shell ist und somit ihre Umgebung erbt. In diesem Fall erben Sie also von der Shell in Terminal.app

Hinweis X11 unterscheidet sich beim Ausführen von einer Shell, sodass die Shell Umgebungsvariablen enthält, da diese Shell als Anmeldestelle gestartet wird.

user151019
quelle
3

Wie Mark sagte, rufen Terminal und iTerm 2 Shells standardmäßig als Login-Shells auf, sodass Bash liest, ~/.bash_profileaber nicht ~/.bashrc, aber M-x shellund M-x termShells als Nicht-Login-Shells aufruft, sodass Bash ~/.bashrcaber nicht liest ~/.bash_profile. Fügen Sie entweder . ~/.bash_profilezu ~/.bashrcund halten mit ~/.bash_profileals Bash - Konfigurationsdatei, oder fügen Sie . ~/.bashrczu ~/.bash_profileund beginnen ~/.bashrcals Bash - Konfigurationsdatei.

Um shell-commandund shell-command-on-regionzu lesen ~/.bash_profile, fügen Sie -lzu shell-command-switch:

(setq shell-command-switch "-lc")

Sie können einen OS X-weiten Standardpfad festlegen, indem Sie beispielsweise eine Eigenschaftsliste wie folgt speichern ~/Library/LaunchAgents/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>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>

Der neue Pfad sollte nach dem Abmelden und erneuten Anmelden in Terminalanwendungen, Emacs und anderen Anwendungen angezeigt werden. Diese Methode ändert den Pfad in Anwendungen nicht, die als Anmeldeelemente geöffnet oder beim Anmelden nach einem erzwungenen Herunterfahren erneut geöffnet werden. Wenn Sie über Emacs, eine Terminalanwendung oder andere Anwendungen verfügen, in denen Sie den Pfad in Anmeldeelementen ändern möchten, müssen Sie diese entfernen.

Nisetama
quelle