ব্যবহারকারী সংজ্ঞায়িত bash_completion.d স্ক্রিপ্টগুলির জন্য স্ট্যান্ডার্ড জায়গা?


47

আমার লিনাক্স (সুস) মেশিনে ব্যবহারকারীর অ্যাক্সেস রয়েছে (কোনও মূল নেই) যেখানে আমি কিছু ব্যাশ স্ক্রিপ্ট এবং সংশ্লিষ্ট ব্যাশ স্বয়ংক্রিয়রণ বিধি তৈরি করেছি।

যেহেতু স্ক্রিপ্টগুলি কেবলমাত্র আমার ব্যবহারকারীর অন্তর্ভুক্ত এবং তাই আমার জন্য আমার সম্পূর্ণ নিয়মাবলী কেবল "সক্রিয়" প্রয়োজন (আমার কাছে কোনও রুট লেখার অ্যাক্সেস নেই এমন একটি অংশ), আমার বাশ_কম্পিশন স্ক্রিপ্টটি /etc/bash_completion.d/ফোল্ডারে স্থাপন করা কোনও বিকল্প নয়।

এই মুহুর্তে আমি আমার ফাইলটির নামকরণ করেছি .bash_completion.myscriptএবং এটি সরাসরি আমার থেকে উত্স করেছি .bashrc, তবে আমি কেবল আশ্চর্য হয়েছি যে ইতিমধ্যে বাশ বাস্তবায়নে বিবেচিত এই ফলাফলগুলি অর্জনের কোনও "মানক" উপায় আছে কিনা?

উদাহরণস্বরূপ, একটি ফোল্ডার তৈরি /home/myuser/.bash_completion.d/?

উত্তর:


36

একটি ~/.bash_completionফাইল ব্যবহার করুন।

থেকে ব্যাশ সম্পূর্ণতা প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী :

প্র: আপনি
যখনই নতুন রিলিজ প্রকাশ করেছেন তখন আমি কীভাবে আমার নিজের স্থানীয় পরিপূর্ণতাগুলি এগুলি পুনরায় সন্নিবিষ্ট না করে sertোকাতে পারি?

উ: এগুলিকে ~ / .Bash_completion এ রাখুন, যা
মূল সমাপ্তির স্ক্রিপ্টের শেষে পার্স করা আছে । পরবর্তী প্রশ্নটি দেখুন।

প্র: আমি প্যাকেজ এক্স লেখক / রক্ষণাবেক্ষণ করি
এবং এই প্যাকেজটির জন্য আমার নিজের সম্পূর্ণ কোডটি বজায় রাখতে চাই ।
ইন্টারেক্টিভ ব্যাশ শেলগুলি এটির সন্ধান করবে এবং এটি উত্পন্ন করবে তা নিশ্চিত করার জন্য আমার এটি কোথায় রাখা উচিত ?

উ:
বাশ-সমাপ্তির pkgconfig ফাইল ভেরিয়েবল দ্বারা নির্দেশিত ডিরেক্টরিগুলির একটিতে এটি ইনস্টল করুন । দুটি
বিকল্প রয়েছে: প্রস্তাবিতটি হ'ল '
কমপ্লেশনডির ' (এটি "pkg-config --variable = পরিপূর্ণতা বাশ-সমাপ্তি" সহ পান) যা থেকে
সম্পূর্ণ আদেশগুলি আদেশের নামের উপর ভিত্তি করে চাহিদা অনুযায়ী লোড করা হয়,
সুতরাং আপনার নামটি অবশ্যই নিশ্চিত করুন সেই অনুযায়ী সমাপ্তি ফাইল, এবং
উদাহরণস্বরূপ প্রতীকী লিঙ্কগুলি অন্তর্ভুক্ত করার জন্য যদি ফাইলটি
একাধিক কমান্ডের জন্য পরিপূর্ণতা সরবরাহ করে।
পিছনে সামঞ্জস্যতার কারণে উপস্থিত অন্য একটিটি হ'ল 'কমপ্যাটডির' (এটি
"পিকেজি-কনফিগারেশন - পরিবর্তনশীল = কমপ্যাটডির বাশ-সমাপ্তি" সহ পান)


জিজ্ঞাসার আগে আমি সার্ভারফল্টের ভিতরে অনেকগুলি গুগল করেছিলাম এবং অনুসন্ধান করেছিলাম, তবে সর্বাধিক প্রাথমিক পদক্ষেপ সম্পর্কে ভাবি নি: আরটিএফএম! প্রতিক্রিয়া জন্য অনেক ধন্যবাদ!
কার্লস সালা

4
.bash_completionএটি একটি ফাইল নয় কোনও ডিরেক্টরি নয় তা নির্দিষ্ট করে দিতে পারে । যেহেতু bash_completion.dএকটি ডিরেক্টরি হওয়ায় আমি ধরে নিয়েছিলাম যে আমি কেবল scpআমার স্থানীয় bash_completion.dএবং এটির নামটি রিমোট সার্ভারে রাখতে পারি, তবে পরবর্তী লগিনে এটি আমাকে বলেছিল এটি একটি ফাইল হতে হবে।
NobleUplift

3
@ নোবলপ্লিফ্ট বাশ কমপ্লিটেশন এফএকিউ পরিবর্তিত হয়েছে এবং এখন চাহিদা অনুসারে একটি ডিরেক্টরি থেকে ব্যবহারকারীর বাশ সম্পূর্ণকরণ লোড করার উপায় সম্পর্কে তথ্য রয়েছে। এটি কমপক্ষে 2.8 দ্বারা বাশ-সমাপ্তি সংস্করণ দ্বারা কাজ করছে বলে মনে হচ্ছে তবে 2.1 দ্বারা নয়। ডিরেক্টরিতে থাকা ফাইলগুলির নাম ঠিক তেমন কমান্ডের মতো করা উচিত, অথবা প্রতীকী লিঙ্কগুলি সেই উদ্দেশ্যে ব্যবহার করা যেতে পারে।
জার্নো

@ জারানো আমি আমাদের সিস্টেমে সমস্ত কাস্টম প্রোগ্রাম এবং স্ক্রিপ্টগুলির জন্য বাশ সম্পূর্ণকরণের স্ক্রিপ্টগুলি কোড করেছিলাম তবে আমার প্রবীণ বিকাশকারীরা সেগুলি নিচে ফেলেছে :(
নোবলআপলিট

@ NobleUplift কেন? আপনি এগুলি যে কোনও উপায়ে নিজের জন্য ব্যবহার করতে পারেন।
জার্নো

49

স্থানীয় ব্যবহারকারীর একটি কার্যক্ষম ~/.bash_completion.d/ডিরেক্টরি থাকতে পারে তা এখানে is

  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.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/*নিম্নলিখিত ত্রুটি বার্তাটি মুদ্রণ করে:

-বাশ: /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
এফওয়াইআই, কিছু দেখানো হচ্ছে (অর্থাত nullglob) সম্পর্কে (বা ডক্সের লিঙ্ক) একটি ব্যাখ্যা পাঠকের পক্ষে সহায়ক।
কমেটসং

1

কমপক্ষে ব্যাশ-সমাপ্তি ২.৮ এবং পরে স্থানীয় বাশ সম্পূর্ণকরণ ডিরেক্টরিতে রাখার বিকল্প সক্ষম করুন

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

সমাপ্তির ফাইলের নাম বা প্রতীকী লিঙ্কের নামগুলি অবশ্যই সম্পর্কিত কমান্ডের সাথে মেলে। এই সম্পূর্ণকরণগুলি কেবলমাত্র চাহিদা অনুযায়ী লোড করা হয়। ফাইলে সঞ্চিত কাজগুলি ~/.bash_completionসর্বদা লোড হয়।

তথ্যসূত্র: "প্রশ্ন। আমার নিজের স্থানীয় পরিপূর্ণতা কোথায় ইনস্টল করা উচিত?" মধ্যে https://github.com/scop/bash-completion/blob/master/README.md

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