कमांड एलियास के लिए मैं बैश पूरा कैसे कर सकता हूं?


57

उदाहरण के लिए, मैं निम्नलिखित कमांड उपनामों को अपनी कमांड लाइन उपनामों पर पूरा करने के लिए देख रहा हूं:

alias apt-inst='sudo aptitude install'

जब मैं टैब कुंजी मारता हूं तो क्या अभिवृत्ति द्वारा प्रदान किए गए पूर्णता प्राप्त करने का कोई तरीका है? यानी जब मैं 'sudo aptitude install gnumer' और हिट टैब लिखता हूं, तो aptitude इसे gnumeric पर पूरा करता है, या अगर अनिश्चितता की सूची उपलब्ध होती है तो सभी gnumer से शुरू होती है। अगर मैं अपने उपनाम का उपयोग कर रहा हूं, तो कुछ भी नहीं - कोई भी पूरा नहीं।


1
यह भी देखें stackoverflow.com/questions/342969/...
nschum

जवाबों:


30

उबंटू मंचों पर इस बारे में एक महान धागा है । ओले जे निम्नलिखित उपनाम पूर्ण परिभाषा फ़ंक्शन का प्रस्ताव करता है:

function make-completion-wrapper () {
  local function_name="$2"
  local arg_count=$(($#-3))
  local comp_function_name="$1"
  shift 2
  local function="
    function $function_name {
      ((COMP_CWORD+=$arg_count))
      COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
      "$comp_function_name"
      return 0
    }"
  eval "$function"
  echo $function_name
  echo "$function"
}

अपने उपनाम के लिए एक पूर्ण फ़ंक्शन को परिभाषित करने के लिए इसका उपयोग करें, फिर उस फ़ंक्शन को उपनाम के लिए संकलनकर्ता के रूप में निर्दिष्ट करें:

make-completion-wrapper _apt_get _apt_get_install apt-get install
complete -F _apt_get_install apt-inst

मैं मौजूदा कार्यक्रमों में हमेशा उपयोग किए गए तर्कों को जोड़ने के लिए उपनाम का उपयोग करना पसंद करता हूं। उदाहरण के लिए, grepमैं हमेशा उपकरणों और बाइनरी फ़ाइलों को छोड़ना चाहता हूं, इसलिए मैं इसके लिए एक उपनाम बनाता हूं grep। जैसे नए कमांड जोड़ने के लिए grepbin, मैं अपने ~/binफ़ोल्डर में शेल स्क्रिप्ट का उपयोग करता हूं । यदि वह फ़ोल्डर आपके रास्ते में है, तो यह स्वतः पूर्ण हो जाएगा।


2
बहुत बढ़िया, मुझे डर था कि यह संभव नहीं होगा।
लेव्सकेव

ध्यान दें कि इस कोड में कुछ समस्याएं हैं। उनके स्पष्टीकरण और संकल्प के लिए मेरा उत्तर देखें।
टॉम हेल

नोट: मैं एक अन्य कमांड के लिए इस तकनीक का उपयोग कर रहा था, और आर्ग्स पास करते समय सही ढंग से काम कर रहे फ़ाइलनाम पूर्ण होने जैसी चीजों को प्राप्त करने के लिए मुझे इसका उपयोग complete -o default -F ...करना था complete -F ...(बैश 4.3.46)।
जोएलट्यूजहोन

28

पूर्ण-उर्फ का प्रयास करें , जो इस समस्या को हल करता है।

इसे स्थापित करने के बाद आप इस तरह से कई उपनामों को पूरा करने के लिए एक सामान्य कार्य का उपयोग कर सकते हैं:

complete -F _complete_alias <myalias1>
complete -F _complete_alias <myalias2>
complete -F _complete_alias <myalias3>

आप के माध्यम से .bash_profileया इसी तरह के हर बैश उदाहरण में full_alias फ़ाइल को स्रोत करना चाह सकते हैं ।

स्थापना

mkdir ~/.bash_completion.d
curl https://raw.githubusercontent.com/cykerway/complete-alias/master/bash_completion.sh \
     > ~/.bash_completion.d/complete_alias

आवेदन

source ~/.bash_completion.d/complete_alias

alias container=docker\ container
complete -F _complete_alias container

containerअब मूल _docker()पूर्ण हैंडलर द्वारा स्वत: पूर्ण किया जा सकता है ;

$ container l<Tab>
logs  ls    

$ container s<Tab>
start  stats  stop   

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

@ एमरू मैं यहां कुछ कोड चिपकाने के बारे में सोच रहा था, लेकिन यह शायद यहां स्वीकार किए जाने से अधिक लंबा है। मुझे लगता है कि लोगों को README फ़ाइल में इंस्टॉल सेक्शन पढ़ने में कोई समस्या नहीं है , और इस मामले में यह केवल कई लाइनें हैं।
साइकर

2
बिंदु यह निर्धारित करने में सक्षम है कि क्या कहा गया है कि README सार्थक है, केवल उत्तर से।
मुरु

यह एक पर्याप्त उत्तर है और यह समस्या को हल करता है।
урослав Рахматуллин

1
यह एक उत्कृष्ट और बहुत व्यापक जवाब है जो पूरी तरह से काम करता है, धन्यवाद!। शायद यह अपडेट किया गया है क्योंकि @ मुरु को इससे समस्या थी।
ब्रायन टॉपिंग

3

2018 का जवाब

आपको अपना उपनाम कार्यक्रम 'पूरा' में जोड़ना होगा। आप जिस तरह के ऑटोकम्पशन को प्राप्त करना चाहते हैं, उसके आधार पर आपको -c या -F का उपयोग करना चाहिए।

पैकेज स्वतः पूर्णता के लिए:

complete -c name_of_your_alias

कमांड स्वतः पूर्णता के लिए:

complete -F name_of_your_alias

यह जांचने के लिए कि क्या आपका उपनाम सही तरीके से जोड़ा गया था:

complete | grep name_of_your_alias

अंत में, 'पूर्ण' से एक उपनाम हटाने के लिए:

complete -r name_of_your_alias

आपके मामले में:

complete -c apt-inst

1
कृपया टिप्पणियों में अपना उत्तर जारी न रखें। यदि आपके पास कहने के लिए चीजें हैं, तो उन्हें उत्तर में संपादित करें।
जी-मैन

2
complete -F xxxOSX पर काम नहीं करता है (यह सिर्फ उपयोग दिखाता है complete: usage: complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [name ...])। क्या आपके पास कोई सूचक है? धन्यवाद।
एन्थोनी कोंग

इसके बजाय इसका उपयोग करें: unix.stackexchange.com/questions/224227/…
रिच

2

यहाँ कुछ सुधारों के साथ शॉन जे। गोफ के उत्तर का कोड दिया गया है:

  • फिक्स्ड वाक्यविन्यास त्रुटियों से प्रकाश डाला shell-check, पहले जैसे "की "$@"वास्तव में समाप्त हो गया समारोह परिभाषा स्ट्रिंग।
  • हटा दिया return 0ताकि अंतर्निहित फ़ंक्शन का रिटर्न मान कॉलर को वापस पारित किया जा सके।

# Wraps a completion function, eg for use with an alias.
# Usage:
# make-completion-wrapper <actual completion function> <name of new func.>
#                         <command name> <list supplied arguments>
# eg.
#   alias agi='apt-get install'
#   make-completion-wrapper _apt_get _apt_get_install apt-get install
#     # defines a function called _apt_get_install (that's $2) that will
#     # complete the 'agi' alias. 
#   complete -F _apt_get_install agi
function make-completion-wrapper {
  local function_name="$2"
  local arg_count=$(( $#-3 ))
  local comp_function_name="$1"
  shift 2
  local function="function $function_name {
      (( COMP_CWORD += $arg_count ))
      COMP_WORDS=( \"\$@\" \${COMP_WORDS[@]:1} )
      \"$comp_function_name\"
    }"
  eval "$function"
  # echo "$function"
}
export -f make-completion-wrapper

मेरे लिए बश में काम नहीं करता है 4.3.46 मुझे डर है। शॉन जे। गोफ का जवाब काम करता है
जोएलट्यूजहोन

1
फ़ंक्शन परिभाषा स्ट्रिंग "एंडिंग" उद्देश्य पर है; बिंदु बाहरी फ़ंक्शन से COMP_WORDSसरणी में तर्कों को शामिल करना है । यदि हम make-completion-wrapper _apt_get _apt_get_install apt-get installएक उदाहरण के रूप में उपयोग करते हैं , के बाद shift 2, $@शामिल हैं apt-get install। कार्य करते समय फ़ंक्शन की परिभाषा apt-get install(दो शाब्दिक शब्द) शामिल हैं COMP_WORDS
जेफरी टू

0

@ उत्तर के विस्तार के रूप में, निम्नलिखित सुविधा फ़ंक्शन make-completion-wrapperएक पंक्ति में पूर्णता को परिभाषित करना संभव बनाने के लिए उत्पन्न रैपर को स्वतः नाम देता है :

function complete-alias  {
    # uses make-completion-wrapper: https://unix.stackexchange.com/a/4220/50978
    # example usage
    # complete-alias _pass pshow pass show
    # complete-alias _pass pgen pass generate

    EXISTING_COMPLETION_FN=${1} && shift
    ALIAS=${1} && shift
    AUTOGEN_COMPLETION_FN="__autogen_completion_${ALIAS}"
    make-completion-wrapper ${EXISTING_COMPLETION_FN} ${AUTOGEN_COMPLETION_FN} ${*}
    complete -F ${AUTOGEN_COMPLETION_FN} ${ALIAS}
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.