Macで実行されているEmacs内で生成されたターミナル/シェルをネイティブターミナルの環境変数を継承させる方法は?


7

Macの端末、つまりSpotlightまたはLaunchpadを介して生成された端末は、でのカスタマイズを含む必要な環境変数を採用します~/.bash_profile。私は(Emacsの実行時にでもEmacs.appから取られたのEmacs用のMac OS X)とその内部に産卵シェル(いずれかを使用してshelleshellまたはをterm)先に述べたように、シェルは同じ環境変数を採用していません。

私は、シェルが起動して、それがEMAC(例えばのものと、そのシェルの環境変数の値が同じ、このためであることをプロセスからその環境を採用していることを実感します(getenv "PATH")

内容の内側に進出Terminal.appし、Emacs.app私は幸運取得できませんでした。

Terminal.appEmacs内で生成されたシェルで取得したのと同じ環境変数を自動的に取得するにはどうすればよいですか?また、ターミナルからEmacsを起動することは好みません。

(これはMacOSXっぽすぎて、答えがEmacsの外にある解決策/微調整を提案する可能性があることを理解しています。しかし、質問はEmacsに関係しているので、このサイトを選びました)


ターミナルウィンドウからEmacs.appを起動すると、正しい環境変数が表示されますか?
Melioratus、2015年

そうすることで、環境変数はより豊富になりますが、それが起動された端末の環境変数とは異なります。〜/ .bash_profileのカスタマイズ(エイリアスなど)は読み取られません。@Melioratus
出血する指

1
変だ。私は、~/.bash_profile私が実行時に正しく読み込まれEmacs.app、次のように/Applications/Emacs.app/Contents/MacOS/Emacs . &使用しましたTerminal.app
Melioratus、2015年

私のエイリアスも機能することを確認してください。
Melioratus、2015年

回答:


5

最近、端末の外でemacsを使い始めました。これにより、PATHの問題が発生しました。私は(getenv "PATH")exec-pathに追加することで設定しましたが、最終的には機能しませんでした。

結局、melpa経由でexec-path-from-shellパッケージをインストールしました。これは、$SHELL環境変数を使用してシェルに出力$PATHと結果のコピーを依頼することで機能します。

編集:ここに私が使用するコードがあります

;; 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))

1
この回答がどのように質問に答えるかを説明してください。たとえば、そのパッケージのインストールはどのように役立ちますか?
ドリュー

3

ここに実際のタイトルが与えられている「Macで実行されているEmacs内で生成されたターミナル/シェルをネイティブターミナルの環境変数を継承させる方法」EmacsはどのレベルでもスーパープロセスとしてTerminal.appを持たないため、EmacsはTerminal.appのシェルから何も継承できません。同じファイルを調達して、環境を同じにする必要があります。

AskDifferent でこの回答に基づいて

bashのスタートアップファイルが何であるかに注意する必要があります。〜/ .bash_profileは、別のシェルの起動時にログインシェル〜/ .bashrcで読み取られます。

Cocoa EmacsはGUIであり、実行時にログインシェルが実行されていないサブプロセスで実行されるため、その環境には〜/ .bash_profileをソースとするものがありません。Emacsは非ログインシェルを開始するので、〜/ .bashrc内のすべてが読み取られます。

このようなことは、bashマニュアルで〜/、bash_profileにこれを含めることが推奨されている理由です

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

そして、環境設定を〜/ .bashrcに入れます

理由は/Applications/Emacs.app/Contents/MacOS/Emacsです。端末で動作します。Terminal.appはデフォルトでシェルをログインモードで実行するため、シェルは〜/ .bash_profileをソースとし、emacsはそのシェルのサブプロセスであり、その環境を継承します。したがって、この場合は、Terminal.appのシェルから継承します

注意X11はシェルから実行するときに異なり、シェルはログイン変数として起動されるため、シェルには環境変数があります。


3

同様のマークは、ターミナルとITERM 2ボークバッシュが読みそうすることをデフォルトではログインシェルとしてシェル、言った~/.bash_profileではなく~/.bashrc、しかし、M-x shellおよびM-x termbashの読み取りだから、非ログインシェルとして呼び出しシェルを~/.bashrcではなく~/.bash_profile。追加のどちらか. ~/.bash_profile~/.bashrcして使用し続ける~/.bash_profileあなたのBash設定ファイルとして、または追加. ~/.bashrcする~/.bash_profileと、使用を開始し~/.bashrc、あなたのBash設定ファイルとして。

作成shell-commandしてshell-command-on-region読むには~/.bash_profile、以下に追加-lshell-command-switchます。

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

たとえば、次のようにプロパティリストを保存することで、OS X全体のデフォルトパスを設定できます~/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>

新しいパスは、ログアウトして再度ログインした後、ターミナルアプリケーション、Emacs、およびその他のアプリケーションに表示されます。このメソッドは、ログイン項目として開かれたアプリケーション、または強制シャットダウン後のログイン時に再度開かれたアプリケーションのパスを変更しません。Emacs、ターミナルアプリケーション、またはログイン項目のパスを変更するその他のアプリケーションがある場合は、それらを削除する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.