Emacs और कमांड लाइन $ PATH OSX पर असहमत हैं


18

PATHEmacs पर सेटिंग्स के साथ कुछ समस्याएँ हैं जो मेरे हास्केल पर्यावरण को प्रभावित कर रही हैं:

मैं ZSH का उपयोग कर रहा हूं, और जब मैं कमांड लाइन पर जाता हूं और कॉल करता हूं echo $PATH, तो यह वापस आ जाता है:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin

यह .zprofileमेरे पास कॉन्फ़िगरेशन से आ रहा है:

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

इसलिए, कमांड लाइन से, जब मैं फोन करता which cabalहूं, मैं सही ढंग से प्राप्त करता हूं:/Users/g/Library/Haskell/bin/cabal

जब मैं Emacs शुरू करता हूं shellऔर कॉल करने के लिए जाता which cabalहूं, मुझे मिलता है: /usr/bin/cabalजो मुझे एक अलग संस्करण के कारण समस्या पैदा कर रहा है।

जब मैं echo $PATHEmacs से निरीक्षण करता shellहूं, तो मैं देखता हूं:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/g/Library/Haskell/bin:/usr/local/sbin

मुझे नहीं पता कि पृथ्वी पर कैसे PATHअलग हो सकता है ...

किसी को भी पता है कि कैसे मेरे ZSHखोल और Emacs उसी पर सहमत होने के लिए PATH? मुझे संदेह है कि वह क्या नियंत्रित कर cabalरहा है जहां से लोड किया जा रहा है।

अद्यतन : echo $SHELLEmacs प्रिंट से चल रहा है:/bin/zsh

अद्यतन 2 : यह OSX पर है ।

अद्यतन 3 : मैंने निष्पादन-पथ-से-शेल मॉड्यूल का उपयोग करने की कोशिश की है और यह काम नहीं करता है। मेरे पास अभी भी एक ही मुद्दे हैं, और एक साइड इफेक्ट के रूप में, यह मेरे टर्मिनल थीम रंगों को गड़बड़ करता है :(

अद्यतन 4 : मैं Emacs के माध्यम से स्थापित किया है brew install --cocoa --srgb emacsऔर मैं इस तरह से जुड़ा हुआ है कि emacs चलाते हैं:

~ ❯❯❯ 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

क्या आप ZSH का उपयोग अपने लॉगिन शेल के रूप में कर रहे हैं?
वामासा

यकीन नहीं है कि आपको लॉगिन शेल से वास्तव में क्या मतलब है, लेकिन मुझे लगता है कि मैंने chsh...अपने डिफ़ॉल्ट शेल को बदलने के लिए दिन में वापस बुलाया
गेल्डर ज़ैमरेनो

मैं iTerm2 btw का उपयोग कर रहा हूँ ...
गेलर ज़ामरेनो

2
जाहिरा तौर पर, ~/.profileया /etc/profileफिर पेट को संशोधित न करें ।
वामासा

1
अपने वातावरण चर सेट करें ~/.zshenv, जो लगातार खट्टा हो जाएगा, हालांकि शेल शुरू किया गया है (इंटरैक्टिव बनाम गैर-इंटरैक्टिव)। यदि आप exec-path-from-shellअपने टर्मिनल थीम रंगों को गड़बड़ कर रहे हैं, तो आप यह सुनिश्चित करने के लिए कॉल करने exec-path-from-shell-argumentsसे nilपहले सेट कर सकते exec-path-from-shell-initializeहैं कि यह आपके zsh config के इंटरेक्टिव भागों को नहीं चला रहा है।
पवित्रता १।

जवाबों:


14

आप निष्पादन-पथ से शेल पैकेज भी स्थापित कर सकते हैं और इसे अपनी इनिट फ़ाइल में जोड़ सकते हैं:

(exec-path-from-shell-initialize)

1
प्रश्न उद्धृत पैकेज के लिंक के साथ बेहतर होगा ।
आकर्षित किया

आप सही हैं, मैंने अभी अपना उत्तर संपादित किया है।
बसाक

1
यह सब मैं कभी चाहता था।
djhaskin987

8

यह एक OSX कष्टप्रद पर्यावरण का मुद्दा है, $PATHEmacs में प्रदर्शित होने वाली /etc/pathsफ़ाइल से आ रही है , जो तब मैंने जो कुछ भी खोल में सेट किया है, उसके साथ जुड़ जाता है। मैंने फ़ाइल /Users/g/Library/Haskell/binके शीर्ष पर जोड़ा /etc/pathsऔर यह तब ठीक काम किया।

शेल में जाना और echo $PATHEmacs में कॉल करना अब दिखाता है:/Users/g/Library/Haskell/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin

और cabalसंस्करण वास्तव में है cabal-install version 1.22.2.0: डी

सबको शुक्रीया!!


$PATHOSX पोस्ट पर इस बारे में उनके संकेत के लिए धन्यवाद ।
गेल्डर ज़ामरेनो

2
एक बेहतर उपाय यह है कि पथ को संशोधित किया जाए ~/.zshenv। वहाँ परिवर्तन Emacs 'पथ
गेलर ज़मर्रेनो

मैं इस बात की पुष्टि कर सकता हूं कि बस कर echo export PATH=$PATH > ~/.zshenvEmacs M-x shellइसे अगले आह्वान पर उठाता है।
लाइनस अरवर

5

यदि आप अपने GUI वातावरण (gnome, kde, ...) से emacs शुरू करते हैं, तो आपके शेल स्टार्टअप स्क्रिप्ट आपके वातावरण में उपलब्ध नहीं होंगे। ताकि $PATHआप ध्यान से अपने में सेट .zshलोड नहीं किया जाएगा। जीयूआई वातावरण आमतौर पर इनका स्रोत नहीं है, हालांकि वे आपकी ~/.profileफ़ाइल को लोड कर सकते हैं ।

आप इसे अपने साथ जोड़ने का प्रयास कर सकते हैं .pam_environment:

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

इसे लोड करने के लिए आपको अपने GUI सत्र को पुनरारंभ करना होगा।

यह दस्तावेज़ आपके $PATHचर सेट को ठीक से प्राप्त करने में आपकी मदद कर सकता है:

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

मैं ~/.pam_environmentप्रबंधित वातावरण चर के लिए फ़ाइल का उपयोग करता हूं जिसे मुझे अपने शेल या ईएमएसी प्रक्रियाओं से सुलभ होने की आवश्यकता है।

पुनश्च: एक अद्भुत टिप्पणीकार बताते हैं कि आप शायद मैक पर हैं। मुझे नहीं पता कि $PATHमैक जीयूआई में आपको कैसे सेट करना है , लेकिन बिंदु अभी भी आपके शेल के पर्यावरण और जीयूआई पर्यावरण के बीच अंतर के बारे में है। आप $PATHGUI के लिए कैसे सेट करते हैं यह OS संस्करण पर निर्भर करता है। हालाँकि आप उपयोग कर सकते हैं:

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

अपने में ~/.emacs.d/initआप सिर्फ एक समाधान है कि काम करना चाहिए चाहते हैं।

PPS: यदि आप emacs में एक शेल चलाना चाहते हैं, तो आप शायद ansi-termइसके बजाय उपयोग से बेहतर हैं shell


मुझे संदेह है कि प्रश्न लिनक्स के बारे में है जिसे प्रश्नकर्ता ने iTerm 2 के उपयोग का उल्लेख किया है ।
वामासा

3

यदि PATH का कुछ हिस्सा खो जाता है तो आप इसे अपने ~ / .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.

PATH के मुद्दों से बचने के लिए, मैं हमेशा ~ / .bashrc से निर्यात किए गए PATH के साथ कमांड लाइन से emacs शुरू करता हूं।


2

इसे पूरा करने का एक और तरीका यह है कि हम केवल शेल को बताएं कि यह एक लॉगिन शेल है ताकि यह सभी सही फ़ाइलों का स्रोत हो। मैं यह करने के लिए सेटिंग explicit-bash-argsसे बैश के लिए करते हैं ("--noediting" "--login")। ऐसा लगता है कि zsh के लिए समतुल्य को सेट explicit-zsh-argsकरना होगा ("-l")

तो मेरे में .emacs:

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

तुम्हारा, कुछ इस तरह से:

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

मुझे लगता है कि "--noediting"यह अनावश्यक है, और इस बारे में zsh को बताने का कोई तरीका नहीं प्रतीत होता है, लेकिन यह जांचने के लिए कुछ हो सकता है कि क्या यह काम नहीं करता है जैसा कि आप आशा करेंगे।


1
यह Emacs के तहत एक शेल रन के लिए काम करता है। यह Emacs के भीतर चलने वाली कमांड्स के लिए काम नहीं करता है, जैसे कि के माध्यम से M-x shell-command
मर्स्ट

1

उदाहरण के लिए आप इस तरह से एक संपत्ति सूची को बचाने के लिए एक ओएस एक्स-वाइड डिफ़ॉल्ट पथ सेट कर सकते हैं ~/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>

आपके द्वारा लॉग आउट और वापस करने के बाद नए पथ को गोले, Emacs और अन्य अनुप्रयोगों में दिखाया जाना चाहिए।

यह विधि उन अनुप्रयोगों में पथ नहीं बदलती है जो लॉगिन आइटम के रूप में खोले जाते हैं या जब एक मजबूर शटडाउन के बाद अनुप्रयोगों को लॉगिन पर फिर से खोल दिया जाता है। यदि आपके पास Emacs, एक टर्मिनल एप्लिकेशन, या अन्य एप्लिकेशन हैं जहां आप लॉगिन आइटम में पथ बदलना चाहते हैं, तो आपको उन्हें निकालना होगा।

10.9 और पूर्व में आप इस तरह एक पंक्ति जोड़ सकते हैं /etc/launchd.conf:

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

हालाँकि /etc/launchd.conf10.10 में समर्थन को हटा दिया गया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.