उपयोगकर्ता परिभाषित bash_completion.d स्क्रिप्ट के लिए मानक स्थान?


47

मेरे पास एक लिनक्स (एसयूएस) मशीन में उपयोगकर्ता की पहुंच (कोई रूट) नहीं है जहां मैंने कुछ बैश स्क्रिप्ट और संबंधित बैश ऑटोकंप्लीशन नियमों को विकसित किया है।

चूंकि स्क्रिप्ट केवल मेरे उपयोगकर्ता से संबंधित हैं और इसलिए मुझे मेरे लिए पूर्ण नियमों की केवल "सक्रिय" आवश्यकता है (इस तथ्य का एक हिस्सा कि मेरे पास कोई रूट राइट नहीं है), मेरी bash_completion स्क्रिप्ट को /etc/bash_completion.d/फ़ोल्डर में रखना एक विकल्प नहीं है।

फिलहाल मैंने अपनी फ़ाइल को नाम दिया .bash_completion.myscriptऔर इसे सीधे अपने स्रोत से .bashrc, लेकिन मुझे आश्चर्य है कि अगर इन परिणामों को प्राप्त करने का कोई अन्य "मानक" तरीका है, जो पहले से ही बैश कार्यान्वयन में माना जाता है।

उदाहरण के लिए, एक फ़ोल्डर बनाना /home/myuser/.bash_completion.d/?

जवाबों:


36

एक ~/.bash_completionफ़ाइल का उपयोग करें ।

से बैश समापन पूछे जाने वाले प्रश्न :

प्र।
हर बार जब आप नई रिलीज़ जारी करते हैं, तो उन्हें पुन: व्यवस्थित करने के बिना मैं अपनी स्थानीय पूर्णियाँ कैसे सम्मिलित कर सकता हूँ ?

A. उन्हें ~ / .bash_completion में रखें, जो
मुख्य पूर्ण स्क्रिप्ट के अंत में पार्स किया गया है । अगला प्रश्न भी देखें।

Q. मैं पैकेज X का लेखक / रखरखाव करता हूं और
इस पैकेज के लिए अपना स्वयं का पूरा कोड रखना चाहता हूं । मुझे यह सुनिश्चित करने के लिए कहां रखना चाहिए
कि इंटरैक्टिव बैश शेल इसे ढूंढेंगे और इसे स्रोत करेंगे?

A. इसे
बैश-कम्पलीशन के pkgconfig फ़ाइल चर द्वारा इंगित की गई निर्देशिकाओं में से एक में स्थापित करें । दो
विकल्प हैं: अनुशंसित एक '
पूर्णतांशी ' है (इसे "pkg-config --variable = पूर्णतांश बैश-समापन" के साथ प्राप्त करें) जिसमें से
पूर्ण किए गए आदेशों के नामों के आधार पर माँगों पर भार डाला जाता है,
इसलिए अपना नाम अवश्य दें तदनुसार फ़ाइल को पूरा करना, और
उदाहरण के लिए शामिल करने के लिए यदि फ़ाइल
एक से अधिक कमांड के लिए पूर्णता प्रदान करती है तो प्रतीकात्मक लिंक । दूसरा जो
पश्चगामी अनुकूलता के कारणों के लिए मौजूद है, वह है 'हम्पिटिर' (इसे
"pkg-config --variable = हमदर्द बश-पूर्ण" के साथ प्राप्त करें)


मैंने गुगली की और पूछने से पहले सर्वरफॉल्ट के अंदर बहुत खोज की, लेकिन सबसे बुनियादी कदम के बारे में नहीं सोचा: RTFM! प्रतिक्रिया के लिए बहुत धन्यवाद!
कार्ल साला

4
निर्दिष्ट करना चाहते हैं कि .bash_completionएक फ़ाइल है और निर्देशिका नहीं है। चूंकि bash_completion.dएक निर्देशिका है, मैंने मान लिया था कि मैं सिर्फ scpअपना स्थानीय bash_completion.dनाम रख सकता हूं और इसे दूरस्थ सर्वर पर बदल सकता हूं , लेकिन अगले लॉगिन पर मुझे बताया कि यह एक फाइल बनना था।
नोबल अपलिफ्ट

3
@NobleUplift बैश कम्प्लीटेशन एफएक्यू बदल गया है और अब डिमांड पर डायरेक्टरी से यूजर बैश कंप्लीशन लोड करने के तरीके की जानकारी है। यह बैश-पूर्ण संस्करण 2.8 से कम से कम काम करने लगता है, लेकिन 2.1 से नहीं। डायरेक्टरी की फाइलों का नाम ठीक उसी तरह रखा जाना चाहिए जैसा वे हैं, या प्रतीकात्मक लिंक का उपयोग उस उद्देश्य के लिए किया जा सकता है।
जर्नो

हमारे सिस्टम के सभी कस्टम प्रोग्राम और स्क्रिप्ट्स के लिए @jarno कोड बैश स्क्रिप्ट्स को पूरा किया, लेकिन मेरे वरिष्ठ डेवलपर्स ने उन्हें नीचे गोली मार दी :(
NobleUplift

@ नोबल उत्थान क्यों? आप उन्हें अपने लिए वैसे भी इस्तेमाल कर सकते हैं।
जारो

49

यहां बताया गया है कि स्थानीय उपयोगकर्ता की वर्किंग ~/.bash_completion.d/डायरेक्टरी कैसे हो सकती है ।

  1. फ़ाइल संपादित करें:, nano ~/.bash_completionनिम्नलिखित जोड़ें:

    for bcfile in ~/.bash_completion.d/* ; do
      . $bcfile
    done
  2. निर्देशिका बनाएं: mkdir ~/.bash_completion.d

  3. फ़ाइल संपादित करें:, ~/.bash_completion.d/myscriptनिम्नलिखित जोड़ें:

    _myscript_tab_complete () {
        local cur prev opts
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        words="-f -h --etc"
    
        COMPREPLY=( $(compgen -W "${words}" -- ${cur}) )
        return 0
    }
    complete -F _myscript_tab_complete myscript
  4. स्रोत .bash_completion: . ~/.bash_completion

अपडेट करें

यदि आप एक खाली ~/.bash_completion.d/निर्देशिका होने का अनुमान लगाते हैं , और त्रुटि संदेश देखने से बचना चाहते हैं bash: /home/<username>/.bash_completion.d/*: No such file or directory, तो एक फ़ाइल प्रकार परीक्षण जोड़ें [ -f "$bcfile" ]

for bcfile in ~/.bash_completion.d/* ; do
  [ -f "$bcfile" ] && . $bcfile
done

2

रसेल ई Glaue द्वारा जवाब महान है, लेकिन इसके ~/.bash_completionअधूरा है।

समस्या तब है जब ~/.bash_completion.d/खाली है और बाद for f in ~/.bash_completion.d/*में निम्न त्रुटि संदेश प्रिंट करता है:

-bash: /home/user/.bash_completion.d/*: ऐसी कोई फ़ाइल या निर्देशिका नहीं

यदि निर्देशिका खाली है, तो सबसे सरल, पोर्टेबल समाधान लूप को छोड़ना है:

if [[ -d ~/.bash_completion.d/ ]] && \
   ! find ~/.bash_completion.d/. ! -name . -prune -exec false {} +
then
    for f in ~/.bash_completion.d/*
    do
        source "$f"
    done
fi

1

एक सरल उपाय नलग्लोब विकल्प का उपयोग करना है। हालांकि यह पोर्टेबल नहीं है, न ही बैश पूर्णताएं हैं। तो पोर्टेबिलिटी कोई फर्क नहीं पड़ता।

साथ ही, आप सोर्स करते समय वेरिएबल के आसपास के कोट्स का उपयोग करना चाहेंगे। यह उस मामले को संभालता है जहां फ़ाइल में अन्य विशेष वर्णों के स्थान होते हैं।

shopt -s nullglob

for f in ~/.bash_completion.d/*; do
  [ -f "$f" ] && . "$f"
done

1
FYI, (या डॉक्स से लिंक) की एक व्याख्या जो कुछ दिखाया जा रहा है (यानी nullglob) पाठक के लिए उपयोगी है।
कोमेत्सॉन्ग

1

कम से कम bash-2.8 को पूरा करने और बाद में स्थानीय बैश पूर्णता को निर्देशिका में रखने के विकल्प को सक्षम करें

${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions

पूर्ण फ़ाइल नाम या प्रतीकात्मक लिंक नाम संबंधित कमांड नामों से मेल खाना चाहिए। ये पूर्ति केवल मांग पर भरी जाती है। फ़ाइल में संग्रहीत ~/.bash_completionपूर्णांश हमेशा लोड किए जाते हैं।

संदर्भ: देखें "Q. मुझे अपना स्थानीय स्थान कहां स्थापित करना चाहिए?" में https://github.com/scop/bash-completion/blob/master/README.md

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