क्या यह संभव है कि बैश निर्देशिका नामों को पूरा करने के तरीके को कॉन्फ़िगर करे?


8

मैं कुछ निर्देशिका नामों पर पूरा करने के लिए एक विशेष विधि का उपयोग करने के लिए बैश का निर्देश देना चाहूंगा। उदाहरण के लिए, यदि कोई रास्ता "$ $" से शुरू होता है, तो उसे पूरा करने के लिए बैश मेरा एक कार्यक्रम कहेगा और सामान्य रूप से अन्यथा पूरा करेगा।

क्या ये संभव भी है? आप इसे कैसे लागू करेंगे?

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

cp $$patern + <Tab>

और ऑटोजम्प पूरा करेगा

cp /home/user/CompliCatedDireCTOry/long/path/bla/bla

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


Bash man पेज में "प्रोग्राम कम्पलीट कम्प्लीशन" देखें।

यदि आप मेरे प्रश्न को बंद करने के लिए मतदान करते हैं, तो कृपया बताएं कि क्यों।
सेल्टियर

2
"पूर्ण" अपने $ $ एक शुरुआत और "-F func" से मेल खाने के लिए अपने स्वयं के फ़ंक्शन को कॉल करने के लिए "-G पैटर्न" का समर्थन करता है, लेकिन इसे काम करने के लिए एक या अधिक कमांड नामों की आवश्यकता होती है।

सिर्फ एक पर्यावरण चर का उपयोग क्यों न करें? उदाहरण के लिए: cp $ prefix / file / path / to / dest /
Xenoactive

@Xenoactive: क्योंकि ऑटोजम्प पूरी तरह से स्वचालित है, और एक से अधिक पथ पर काम करता है। मैन्युअल रूप से सेट किए गए पर्यावरण चर का उपयोग करने से मदद नहीं मिलती है। या शायद आपके पास एक शक्तिशाली विचार है जो मुझे समझ में नहीं आता है?
पेल्टियर

जवाबों:


3

आप TAB (^ i) के लिए डिफ़ॉल्ट बाइंडिंग को ओवरराइड करके ऐसा कर सकते हैं। पहले आपको TAB बाइंडिंग को ओवरराइड करने की आवश्यकता है, फिर आपको एक फ़ंक्शन बनाने की आवश्यकता है जो आपकी कमांड को कॉल करता है, अंत में आपको उस कमांड से आउटपुट लेना होगा और उस वेरिएबल को अपडेट करना होगा जिसमें वर्तमान कमांड लाइन है।

यह फ़ंक्शन वर्तमान कमांड लाइन लेता है और अंतिम दो वर्णों को 'हग्स' में बदलता है।

function my_awesome_tab_completion_function () {
  set -- $READLINE_LINE
  command="$1"
  shift
  argument="$*"
  argument_length=$(echo -n $argument | wc -c)
  if echo $argument | grep '^$$' >/dev/null 2>&1; then
    new_argument=$(echo $argument | sed 's/..$/huugs/') # put your autojump here
  else
    new_argument=$(compgen -d $argument)
  fi
  new_argument_length=$(echo -n $new_argument | wc -c)
  READLINE_POINT=$(( $new_argument_length - $argument_length + $READLINE_POINT ))
  READLINE_LINE="$command $new_argument"
}

अपने उदाहरण के लिए आप शायद इस तरह दिखने के लिए new_argument लाइन बदलना चाहते हैं:

  new_argument=$(autojump $argument)

अब ^ i बाइंडिंग को ओवरराइड करें:

$ bind -x '"\C-i"':'my_awesome_tab_completion_function'

अब परीक्षण करें कि यह काम करता है:

$ cd /ro<TAB>
changes my command to:
$ cd /root

इतना सामान्य समापन अभी भी काम करता है, आप $ $ का हिस्सा cd $ $ ... आदि का परीक्षण कर सकते हैं

यदि आप वर्बोज़ मोड चालू करते हैं, तो:

$ set -x

यह सब कुछ प्रिंट करेगा जो फ़ंक्शन कर रहा है।

मैंने इसका उपयोग Ubuntu 11 पर bash 4.2.8 (1) -release (डिफ़ॉल्ट) का उपयोग करके किया।


यह मुझे लगता है कि यह केवल कमांड के पहले पैरामीटर पर काम करता है, और अजीब सामान भी कर सकता है यदि टैब का उपयोग अनपेक्षित तरीकों से किया जाता है (उदाहरण के लिए $ $ $ या कमांड के नाम के बाद), या क्या मैं गलत हूं?
harrymc

अच्छी तरह से यह $ * गुजर रहा है, इसलिए यह केवल पहले पैरामीटर से अधिक पर 'काम' करेगा (मुझे पता नहीं है कि ऑटोजम्प बिल्कुल नहीं है इसलिए मुझे यकीन नहीं है कि यह कई तर्क ले सकता है)। आप अंत में शिफ्ट हो सकते हैं और केवल अंतिम को ऑटोजंप में भेज सकते हैं, या यह निर्धारित करने के लिए READLINE_POINT का उपयोग कर सकते हैं जहां कर्सर कमांड के तर्कों के बीच है और केवल उस 'शब्द' को ऑटोजंप को भी भेजें।
बहुपद

आपका समाधान दिलचस्प है, लेकिन आपको यह स्वीकार करना होगा कि टैब कुंजी को संभालना थोड़ा चरम है। ऐसा कोई तरीका नहीं है कि आप सभी संभावित मामलों का अनुमान लगा सकें।
harrymc

आपके उत्तर के लिए धन्यवाद, यह एक अच्छा वैकल्पिक समाधान है, और यह मेरे प्रश्न के "सभी कमांड के लिए" भाग को संबोधित करता है। मैं harrymc से सहमत हूं कि यह थोड़ा चरम है, हालांकि ... मुझे लगता है कि अगर कोई बेहतर समाधान नहीं लाता है, तो मैं इसे एक कोशिश करूँगा और देखूंगा कि क्या यह व्यवहार्य है।
पेल्टियर

हां, मैं harrymc से भी सहमत हूं, लेकिन पूछे गए सवाल का जवाब देने की कोशिश कर रहा था। व्यक्तिगत रूप से मैं इसे ^ G या किसी अन्य नियंत्रण कुंजी की तरह बांधूंगा ताकि मैं टैब को अकेला छोड़ सकूं लेकिन फिर भी इस कार्यक्षमता का उपयोग कर सकता हूं।
बहुपद

1

बैश पूरा होने की दिनचर्या को शेल स्क्रिप्ट के रूप में प्रोग्राम किया जा सकता है।

यहाँ एक खोल स्क्रिप्ट है कि किसी भी पैरामीटर में बदल देगा का एक उदाहरण है $$[Tab]द्वारा my replacement string, लेकिन केवल विशिष्ट आदेश के लिए mycommandऔर केवल यदि पैरामीटर ठीक है "$$":

_mycomplete()
{
        if [ ${COMP_WORDS[COMP_CWORD]} == \$\$ ]
        then
                COMPREPLY='my replacement string'
        fi
}
complete -o default -o bashdefault -F _mycomplete mycommand

source <file-name>इसे शुरू करने के लिए (या डॉट कमांड) स्क्रिप्ट को काम करने के लिए स्क्रिप्ट को स्रोत बनाना चाहिए , और फिर:

mycommand $$[Tab] -> mycommand my replacement string
mycommand $$$[Tab] -> mycommand $$$ (beep)
mycommand whatever[Tab] -> (will complete "whatever" in the normal bash manner)

हमेशा कुछ या सभी उपयोगकर्ताओं के लिए काम करने के लिए, इसे बैश प्रोफ़ाइल रूटीन में शामिल करें

completeकमांड के साथ समस्या यह है कि यह केवल एक या अधिक कमांड के नामों के लिए काम करेगा, जो पैरामीटर के रूप में निर्दिष्ट हैं। कोई इसे केवल उन सभी कमांडों की सूची दे सकता है जो संभवतः उपयोगकर्ताओं द्वारा उपयोग किए जा सकते हैं, या हताश मामलों में विस्तार कर सकते हैं /bin/* /usr/bin/* ~/bin/*

CentOS 5.5 पर परीक्षण किया गया।

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


आपके उत्तर के लिए धन्यवाद। मेरा प्रश्न वास्तव में इस बारे में नहीं था कि जब से मैं नया आया था तब से संभव था, लेकिन सभी आज्ञाओं को पूरा नहीं करूंगा। हालाँकि, मुझे लगता है कि यदि बहुपद का हल स्वीकार्य नहीं निकला, तो मैं ऐसा ही कुछ लागू करूंगा और सबसे सामान्य आदेशों को लक्षित करने का प्रयास करूंगा।
पेल्टियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.