ফাইলনামের নিদর্শন বা ডিরেক্টরিগুলির জন্য বাশ সম্পূর্ণ


13

আমি ব্যাশ সমাপ্তির স্ক্রিপ্ট সেট আপ করার চেষ্টা করছি এবং কিছুটা সমস্যা হচ্ছে।

আমি এটি সেট আপ করতে চাই যাতে তালিকাভুক্ত পরিপূর্ণতাগুলি হয় কোনও নির্দিষ্ট এক্সটেনশনের সাথে মিলে যাওয়া ফাইলগুলি, বা ডিরেক্টরিগুলি (এতে সেই এক্সটেনশনের ফাইলগুলি থাকতে পারে এবং নাও থাকতে পারে)।

আমার যে সমস্যাটি হচ্ছে তা হ'ল ফাইল এবং ডিরেক্টরিগুলি অন্তর্ভুক্ত করার একমাত্র উপায়টি হ'ল এই জাতীয় কিছু ব্যবহার করে -o plusdirs -f -X '!*.txt', তবে যখন আমি বাশকে ডিরেক্টরিগুলির মধ্যে একটি সম্পূর্ণ করতে দেই, এটি কেবল শেষের চেয়ে একটি স্থান যুক্ত করে দেয় স্ল্যাশ।

_xyz()
{
  local cur=${COMP_WORDS[COMP_CWORD]}
  local prev=${COMP_WORDS[COMP_CWORD-1]}

  #COMPREPLY=( $( compgen -f -X '!*.txt' -- $cur ) )
  #COMPREPLY=( $( compgen -f -G '*.txt' -- $cur ) )
  #COMPREPLY=( $( compgen -o filenames -f -X '!*.txt' -- $cur ) )
  #COMPREPLY=( $( compgen -o dirnames  -f -X '!*.txt' -- $cur ) )
  COMPREPLY=( $( compgen -o plusdirs  -f -X '!*.txt' -- $cur ) )
  return 0
}

complete -F _xyz xyz

আমি সমস্ত মন্তব্য-আউট লাইন খুব চেষ্টা করেছি, কিন্তু তারা ডিরেক্টরিগুলি প্রসারিত করে না।

পরীক্ষার জন্য, আমি এটি একটি .txt ফাইল এবং একটি ডিরেক্টরি "দির" দিয়ে একটি ডিরেক্টরিতে চালিয়ে যাচ্ছি (এটির ভিতরে একটি টেক্সট ফাইল সহ, যদিও এটি এখনও কোনও বিষয় নয়)। xyz <TAB>এই ফাংশনটির সাথে টাইপ করা ডিরেক্টরি এবং .txt ফাইল তালিকাভুক্ত করে তবে টাইপিং xyz d<TAB>প্রসারিত হয় xyz dir(ভাল, "dir" পরে একটি স্থান সহ)।

উত্তর:


10

আপনি ফাংশন তাকান _cd()মধ্যে , / etc / bash_completion , এটির চিহ্ন নিজেই স্ল্যাশ appends এবং যে দেখতে পাবেন সম্পূর্ণ বিকল্প পায় নামক -o nospaceজন্য সিডি

আপনি এক্সআইজেডের জন্যও এটি করতে পারেন , তবে খুঁজে পাওয়া ম্যাচটি ডিরেক্টরি (যদি থাকে তবে স্ল্যাশ যুক্ত করুন) বা একটি ফাইল (যদি থাকে তবে স্পেস যোগ করুন) আলাদা করে যাচাই করতে হবে। সমস্ত পাওয়া মিলগুলি প্রক্রিয়া করার জন্য লুপের জন্য এটি করা উচিত।

এছাড়াও, ফাঁকা স্থানগুলি সঠিকভাবে পরিচালনা করার জন্য আপনাকে কেবলমাত্র নতুন লাইনে অভ্যন্তরীণ ফাইল বিভাজক সেট করতে হবে এবং স্পেসগুলি এড়িয়ে যেতে হবে। এর IFS=$'\n'সাথে একত্রে ব্যবহার করা printf %qপ্রায় সমস্ত অক্ষরের সাথে সমাপ্তির কাজ করে। 1 পিছনের স্থানটি এড়াতে বিশেষ যত্ন নেওয়া উচিত।

নিম্নলিখিত কাজ করা উচিত:

_xyz ()
{
    local IFS=$'\n'
    local LASTCHAR=' '

    COMPREPLY=($(compgen -o plusdirs -f -X '!*.txt' \
        -- "${COMP_WORDS[COMP_CWORD]}"))

    if [ ${#COMPREPLY[@]} = 1 ]; then
        [ -d "$COMPREPLY" ] && LASTCHAR=/
        COMPREPLY=$(printf %q%s "$COMPREPLY" "$LASTCHAR")
    else
        for ((i=0; i < ${#COMPREPLY[@]}; i++)); do
            [ -d "${COMPREPLY[$i]}" ] && COMPREPLY[$i]=${COMPREPLY[$i]}/
        done
    fi

    return 0
}

complete -o nospace -F _xyz xyz

1 নতুনলাইন চরিত্রটি এখানে স্পষ্ট ব্যতিক্রম, যেহেতু এটি একটি অভ্যন্তরীণ ফাইল বিভাজক।


এটি দুর্দান্ত কাজ করে (যদিও এটি খুব খারাপ এটি অন্তর্নির্মিত নয়)। ধন্যবাদ!
রব আই

1
"$ {COMP_WORDS [COMP_CWORD]?" এর পরিবর্তে "$ 2" ব্যবহার না করার কোনও কারণ?
এডওয়ার্ড ফালক

3

আমি মনে করি যে এই সহজ সমাধান এতে কাজ করে:

  1. শেষ হওয়া ডিরেক্টরি এবং ফাইলগুলির সাথে মেলে .txt
  2. ফাইলের নামগুলিতে স্পেস পরিচালনা করে
  3. কোনও পিছনে স্থান ছাড়াই ফোল্ডার সম্পূর্ণতার শেষে স্ল্যাশ যুক্ত করে
  4. একটি ফাইল সমাপ্তি ম্যাচের শেষে স্থান যুক্ত করে

কীটি শেষ হচ্ছিল -o filenames। এটি জিএনইউ ব্যাশ ৩.২.২৫-এ আরএইচইল ৫.৩-তে এবং জিএনইউ ব্যাশ ৪.৩.১৮ এ পরীক্ষিত ছিল

_xyz()
{
  local cur=${COMP_WORDS[COMP_CWORD]}

  local IFS=$'\n'
  COMPREPLY=( $( compgen -o plusdirs  -f -X '!*.txt' -- $cur ) )
}

complete -o filenames -F _xyz xyz

হ্যাঁ এটি দুর্দান্ত কাজ করবে বলে মনে হচ্ছে। অনেক সহজ, গুরুত্বপূর্ণ যুক্তি ধরার জন্য ধন্যবাদ!
রব আমি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.