कोष्ठक में एक rcfile सोर्सिंग बश में?


0

Zsh में, कोष्ठक के माध्यम से बनाई गई एक उपधारा में आदेशों का उपयोग करने के लिए एक rcfile खट्टा हो सकता है जो उपनाम हो सकता है, केवल तब उपलब्ध होता है जब विशिष्ट निर्देशिकाओं को इसमें जोड़ा जाता है PATH, आदि:

~ » /bin/zsh -c "workon"
zsh:1: command not found: workon
------------------------------------------------------------
~ » /bin/zsh -c "source ~/.zshrc; workon"
env1
env2
env3
... (expected output)

हालांकि, एक ही मार के साथ सच नहीं है:

~ » /bin/bash -c "workon"
/bin/bash: workon: command not found
------------------------------------------------------------
~ » /bin/bash -c "source ~/.bashrc; workon"
/bin/bash: workon: command not found
------------------------------------------------------------
~ » bash
sean@helium:~$ workon
env1
env2
env3
... (expected output)

वहाँ किसी भी तरह से एक bash उपधारा एक rcfile स्रोत कर सकते हैं?


"XY समस्या" प्रतिक्रियाओं पर एक सिर शुरू करने के लिए, यह एक स्क्रिप्ट के लिए है in:

#!/bin/zsh
(source ~/.zshrc; cd $1; ${@:2})

मेरे पास परियोजनाओं से भरी एक निर्देशिका है (git का उपयोग करके) जहां मैं अक्सर भूल जाता हूं अगर मैंने कुछ भी नहीं छोड़ा है, तो inमुझे जल्दी से लिखने की अनुमति देता है $ in ProjectDir/ git status, बजाय $ (cd ProjectDir; git status)(पहले वाले को बाद की तुलना में टाइप करना आसान लगता है)।

अधिमानतः, मैं इस स्क्रिप्ट को बैश के साथ प्रयोग करना चाहूंगा (यही कारण है कि मैं पूछता हूं, भले ही यह वर्तमान में zsh के साथ काम करता है)।


मानक उत्तर उपनामों के बजाय निर्यात किए गए कार्यों का उपयोग करना है, जैसे workon() { ...; }; export workon। वैकल्पिक रूप से, workonनिर्देशिकाओं में से एक में एक स्क्रिप्ट बनाएं $PATH
AFH

@AFH workonवास्तव में एक एक्सपोर्टेड फंक्शन है, जिसे पायथन पैकेज का हिस्सा कहा जाता है virtualenvwrapper, इसे माफ़ करने के लिए मेरी माफ़ी एक उपनाम है।
सीन पियानका

मुझे लगता है कि आपको (…)अपनी inस्क्रिप्ट में ज़रूरत नहीं है (यदि आप इसे चलाते हैं bash)।
कामिल मैकियोरोस्की

"अधिमानतः, मैं इस स्क्रिप्ट को बैश के साथ प्रयोग करने योग्य चाहूंगा" - यह मुझे समझ में नहीं आता है। अगर आपकी स्क्रिप्ट सही है, तो आप शेबबंग की परवाह किए बिना inअंदर से दौड़ सकते हैं । यदि यह व्याख्या के अनुसार काम करता है , तो आपको इसे बदलने की आवश्यकता क्यों है? bash$PATHzsh
कामिल मैकियोरोस्की

मैं माफी माँगता हूँ: मैं अपनी परिभाषा -fसे चूक गया exportथा workon- यह होना चाहिए था workon() { ...; }; export -f workon। निर्यात किए गए फ़ंक्शंस किसी भी उपधारा में काम करना चाहिए, इसलिए पहले workonसे चलाने की आवश्यकता के बिना पाया जाना चाहिए ~/.bashrc( PATHनिर्यात किया जाता है)। इसके साथ या समतुल्य परिभाषा, bash -c workonपर्याप्त होनी चाहिए, हालांकि मैं यह नहीं देखता कि आप इसका उपयोग क्यों करेंगे bash -c। वैसे, आपको दूसरी पंक्ति के चारों ओर कोष्ठक की आवश्यकता नहीं है in, क्योंकि स्क्रिप्ट एक सबशेल में चलती हैं (जब तक कि इसे लागू नहीं किया जाता है source), और आपको उप-स्तर के आगे के स्तर की आवश्यकता नहीं है।
AFH

जवाबों:


1

मेरे कुबंटु में पहली बात .bashrcयह है:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

मुझे लगता है कि आपके .bashrcसमान है। यही कारण है कि /bin/bash -c "source ~/.bashrc; …""स्रोत" नहीं है। यदि आप उपयोग करते हैं bash -i -c …तो .bashrcस्वचालित रूप से खट्टा हो जाएगा और आपका sourceइसे दूसरी बार अनावश्यक रूप से पार्स कर देगा।

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