एक कस्टम zshrc के साथ zsh शुरू करें


17

मैं कमांड के समान एक कस्टम आरसी फ़ाइल के साथ zsh शुरू करने में सक्षम होना चाहता हूं: bash --rc-file /path/to/file

यदि यह संभव नहीं है, तो क्या zsh शुरू करना, चलाना संभव है source /path/to/file, तो उसी zsh सत्र में रहें?

नोट: कमांड zsh --rcs /path/to/fileकाम नहीं करता है, कम से कम मेरे लिए नहीं ...

संपादित करें: अपनी संपूर्णता में, मैं निम्नलिखित कार्य करने में सक्षम होना चाहता हूं: sshदूरस्थ सर्वर "example.com" पर, रन zsh, sourceमेरा कॉन्फ़िगरेशन स्थित है /path/to/file, सभी 1 कमांड में। यह वह जगह है जहां मैंने संघर्ष किया है, विशेष रूप से क्योंकि मैं दूरस्थ मशीन पर किसी भी कॉन्फ़िगरेशन फ़ाइलों पर नहीं लिखूंगा।


1
हाय काट्ज़, यूनिक्स में आपका स्वागत है। मैंने आपके प्रश्न को कुछ स्वरूपण को जोड़ने के लिए संपादित किया है जो इसे (थोड़ा) पढ़ने में आसान बनाता है। आप "संपादित करें" पर क्लिक करके देख सकते हैं कि यह कैसे काम करता है। मैंने कुछ अतिरिक्त चीजें भी हटा दी हैं, जैसे "धन्यवाद" और आपके हस्ताक्षर (स्टैक एक्सचेंज नेटवर्क पर सभी पोस्ट स्वचालित रूप से हस्ताक्षरित हैं)।
डीआरएस

1
धन्यवाद, मैंने अब टाइप करना सीख लिया है code as such!
hjkatz

जवाबों:


18

आदमी पृष्ठों से:

STARTUP/SHUTDOWN FILES
       Commands are first read from /etc/zshenv; this cannot be overridden.  Subsequent  be‐
       haviour is modified by the RCS and GLOBAL_RCS options; the former affects all startup
       files, while the second only affects global startup files (those shown here  with  an
       path starting with a /).  If one of the options is unset at any point, any subsequent
       startup file(s) of the corresponding type will not be read.  It is also possible  for
       a  file  in  $ZDOTDIR  to  re-enable  GLOBAL_RCS.  Both RCS and GLOBAL_RCS are set by
       default.

       Commands are then read from $ZDOTDIR/.zshenv.  If the shell is a  login  shell,  com‐
       mands are read from /etc/zprofile and then $ZDOTDIR/.zprofile.  Then, if the shell is
       interactive, commands are read from /etc/zshrc and then $ZDOTDIR/.zshrc.  Finally, if
       the shell is a login shell, /etc/zlogin and $ZDOTDIR/.zlogin are read.

       When a login shell exits, the files $ZDOTDIR/.zlogout and then /etc/zlogout are read.
       This happens with either an explicit exit via the exit  or  logout  commands,  or  an
       implicit exit by reading end-of-file from the terminal.  However, if the shell termi‐
       nates due to exec'ing another process, the logout files are not read.  These are also
       affected  by  the  RCS and GLOBAL_RCS options.  Note also that the RCS option affects
       the saving of history files, i.e. if RCS is unset when the shell  exits,  no  history
       file will be saved.

       If  ZDOTDIR  is unset, HOME is used instead.  Files listed above as being in /etc may
       be in another directory, depending on the installation.

       As /etc/zshenv is run for all instances of zsh, it is important that it  be  kept  as
       small  as  possible.  In particular, it is a good idea to put code that does not need
       to be run for every single shell behind a test of the form `if [[  -o  rcs  ]];  then
       ...' so that it will not be executed when zsh is invoked with the `-f' option.

इसलिए आप ZDOTDIRएक नई निर्देशिका के लिए पर्यावरण चर सेट करने में सक्षम होना चाहिए ताकि एक अलग सेट डॉटफाइल्स की तलाश में zsh प्राप्त कर सकें।

जैसा कि मैन पेज बताता है, RCSऔर GLOBAL_RCSआरसी फ़ाइलों के लिए पथ नहीं हैं, जैसा कि आप उन्हें उपयोग करने का प्रयास कर रहे हैं, बल्कि विकल्प आप सक्षम या अक्षम कर सकते हैं। इसलिए, उदाहरण के लिए, ध्वज विकल्प --rcsको सक्षम करेगा RCS, जिससे zc को आर सी फ़ाइलों से पढ़ा जा सकेगा। आप सक्षम या अक्षम RCSया करने के लिए zsh को निम्न कमांड-लाइन झंडे का उपयोग कर सकते हैं GLOBAL_RCS:

  --globalrcs
  --rcs
  -d    equivalent to --no-globalrcs
  -f    equivalent to --no-rcs

अपने अन्य प्रश्न का उत्तर देने के लिए:

क्या zsh शुरू करना संभव है, "source / path / to / file" रन करें, फिर उसी zsh सत्र में रहें?

हां, उपरोक्त निर्देशों के अनुसार यह बहुत आसान है। बस दौड़ो zsh -d -fऔर फिर source /path/to/zshrc


जैसा कि यह मेरे प्रश्न के अनुसार काम करता है, मैं यह उल्लेख करने में विफल रहा कि मैं केवल 1 कमांड चला सकता हूं। यह संतुष्ट नहीं करता है कि मैं इसके लिए क्या उपयोग करना चाहता हूं (मेरे व्यक्तिगत कॉन्फ़िगरेशन के साथ एक कस्टम ssh)। समस्या यह है कि दौड़ने में झूठ zsh -d -f; source /path/to/fileके पहले सत्र में दूसरे आदेश को कभी भी बाहर निकलने तक निष्पादित नहीं किया जाता है।
hjkatz

इसकी संपूर्णता में मैं निम्नलिखित कार्य करने में सक्षम होना चाहता हूं। sshएक दूरस्थ सर्वर "example.com" पर, रन zsh, sourceमेरा कॉन्फ़िगरेशन /path/to/file1 कमांड में स्थित है । यह वह जगह है जहां मैंने संघर्ष किया है, विशेष रूप से क्योंकि मैं दूरस्थ मशीन पर किसी भी कॉन्फ़िगरेशन फ़ाइलों पर नहीं लिखूंगा। यद्यपि आप जवाब के लिए धन्यवाद!
hjkatz

ऐसा लगता है कि आपकी समस्या कस्टम zshrc का उपयोग करने में नहीं है, लेकिन ssh पर एक शेल का उपयोग करने के तरीके को जानने में नहीं है। यदि आप चलाते हैं ssh host "zsh -d -f; source /path/to/file", तो ssh पहले zshरिमोट होस्ट पर चलेगा , उसके source ...बाद zsh शेल से बाहर निकलेगा। इसके बजाय आप जो करना चाहते हैं ssh -t host zsh -d -f, वह रिमोट होस्ट पर एक इंटरैक्टिव शेल में गिरना है, या यदि आप एक इंटरैक्टिव शेल नहीं चाहते हैं, तो करें ssh host zsh -d -f -c \"source /path/to/file\; other command\; ... \"
जयहेनड्रेन

नहीं मुझे समझ में नहीं आता कि ssh इंटरैक्टिव गोले के साथ कैसे काम करता है। समस्या यह है कि रनिंग ssh -t host "zsh -d -f; source /path/to/fileमुझे एक इंटरएक्टिव (और बंजर) zshशेल में गिरा देती है।
hjkatz

1
मैंने आपको पहले ही बताया था कि यह क्यों है और इसे कैसे ठीक किया जाए। जब आप चलाते हैं ssh -t host "zsh -d -f; source /path/to/file", कमांड source...zsh शेल के अंदर नहीं चलती है। यह zsh शेल से बाहर निकलने के बाद आपके लॉगिन शेल में चलाया जाता है। इसका परीक्षण करने के लिए, दौड़ें ssh host "zsh; echo foo"। आप zsh शेल से बाहर निकलने के बाद आउटपुट "फू" देखेंगे।
जयहिन्द्रे

4

ZDOTDIR के साथ, आप अपने चयन की किसी भी निर्देशिका में zshनामक एक फ़ाइल की व्याख्या करने के लिए कह सकते हैं .zshrc, यह आपके चयन की किसी भी फ़ाइल की व्याख्या करने के लिए (आवश्यक नहीं कहा जाता है .zshrc) काफी मुश्किल साबित होती है।

में shया kshअनुकरण, zshमूल्यांकन करता है $ENV; तो आप emulate zshअपने सबसे ऊपर जोड़ सकते हैं /path/to/fileऔर कर सकते हैं:

ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'

एक और बहुत जटिल दृष्टिकोण हो सकता है:

ssh -t host 'PS1='\''${${functions[zsh_directory_name]::="
    set +o promptsubst
    unset -f zsh_directory_name
    unset PS1
    . /path/to/file
 "}+}${(D):-}${PS1=%m%# }'\' exec zsh -o promptsubst -f

वह एक व्याख्या के लायक है।

${foo::=value}एक चर विस्तार है जो वास्तव में सेट करता है $foo$functionsएक विशेष साहचर्य सारणी है जो मानचित्रों को उनकी परिभाषाओं के नाम देता है।

promptsubstविकल्प के साथ , चर का $PS1विस्तार किया जाता है। तो, पहले प्रॉम्प्ट पर, उस PS1 में चर का विस्तार किया जाएगा।

zsh_directory_nameसमारोह में एक विशेष समारोह है कि विस्तार के मदद करता है ~fooकरने के लिए /path/to/somethingऔर रिवर्स। उदाहरण के लिए इसका उपयोग %~प्रॉम्प्ट में किया जाता है ताकि यदि वर्तमान निर्देशिका है /opt/myproj/proj/xतो आप इसे मैपिंग <=> ~proj:xकरने के रूप में प्रदर्शित कर सकें । इसका उपयोग पैरामीटर विस्तार ध्वज द्वारा भी किया जाता है । इसलिए यदि कोई विस्तार करता है , तो उस फ़ंक्शन को बुलाया जाएगा।zsh_directory_nameproj:x/opt/myproj/proj/xD${(D)somevar}zsh_directory_name

यहाँ, हम प्रयोग कर रहे हैं ${(D):-}, ${:-}यह है कि ${no_var:-nothing}फैलता करने के लिए nothingकरता है, तो $no_varखाली है, इसलिए ${(D):-}जबकि बुला कुछ भी नहीं करने के लिए फैलता है zsh_directory_namezsh_directory_nameपहले के रूप में परिभाषित किया गया है:

zsh_directory_name() {
  set +o promptsubst
  unset -f zsh_directory_name
  unset PS1; . /path/to/file
}

है कि, पहली PS1 विस्तार (प्रथम शीघ्र पर) पर, ${(D):-}कारण होगा promptsubstविकल्प सेट नहीं होने के लिए (रद्द करने के लिए -o promptsubst), zsh_directory_name()अपरिभाषित जा करने के लिए (जैसा कि हम यह केवल एक बार चलाना चाहते हैं) $PS1को सेट किए बिना हो सकता है, और /path/to/filesourced किया जाना है।

${PS1=%m%# }फैलता है (और प्रदान $PS1करने के लिए) %m%#जब तक PS1 पहले से ही (द्वारा उदाहरण के लिए परिभाषित किया गया था /path/to/fileके बाद unset), और %m%#होता है का डिफ़ॉल्ट मान होना करने के लिए PS1


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