ユーザー定義のbash_completion.dスクリプトの標準的な場所は?


47

Linux(Suse)マシンにユーザーアクセス(ルートなし)があり、そこでbashスクリプトと対応するbashオートコンプリートルールを開発しました。

スクリプトはユーザーのみに属しているため、完全なルールが必要なのは「アクティブ」のみであるため(ルート書き込みアクセス権がないという事実の一部)、bash_completionスクリプトを/etc/bash_completion.d/フォルダーに配置することはオプションではありません。

現時点では、ファイルに名前を付けて、.bash_completion.myscriptから直接ソースを.bashrc取得していますが、bashの実装で既に考慮されているこれらの結果を達成する他の「標準的な」方法があるのではないかと思っています。

たとえば、フォルダーを作成します/home/myuser/.bash_completion.d/か?

回答:


36

~/.bash_completionファイルを使用します。

バッシュ完了よくある質問

Q.
新しいリリースを発行するたびに再挿入することなく、自分のローカル補完を挿入するにはどうすればよいですか?

A.これらを〜/ .bash_completionに入れます。これは、
メインの補完スクリプトの最後に解析されます。次の質問もご覧ください。

Q.パッケージXを作成/保守してい
ますが、このパッケージの完了コードを独自に保守したいと思います。
インタラクティブなbashシェルがそれを見つけてソースすることを確認するためにどこに置くべきですか?

A.
bash-completionのpkgconfigファイル変数が指すディレクトリの1つにインストールします。
選択肢は2つあります。推奨されるものは 'completionsdir'(
"pkg-config --variable = completionsdir bash-completion"で取得)です。この
コマンドから、呼び出されたコマンドの名前に基づいてオンデマンドで補完がロードされ
ます。それに応じて、
ファイル
が複数のコマンドの補完を提供する場合に、たとえばシンボリックリンクを含めることができます。
後方互換性の理由で存在するもう1つは 'compatdir'です(
「pkg-config --variable = compatdir bash-completion」で取得します)


質問する前に私はグーグルでサーバーフォールト内をたくさん検索しましたが、最も基本的なステップであるRTFMについては考えませんでした!応答に感謝します!
カールズサラ

4
.bash_completionディレクトリではなくファイルであることを指定したい場合があります。bash_completion.dディレクトリなのでscp、ローカルだけでbash_completion.dリモートサーバー上で名前を変更できると想定していましたが、次のログイン時にファイルである必要があると通知されました。
-NobleUplift

3
@NobleUplift Bash Completion FAQが変更され、オンデマンドでディレクトリからユーザーのBash補完をロードする方法に関する情報が含まれるようになりました。これは少なくともbash-completionバージョン2.8で動作するようですが、2.1では動作しません。ディレクトリ内のファイルには、コマンドの名前とまったく同じ名前を付ける必要があります。そうでない場合は、シンボリックリンクを使用できます。
ジャルノ

@jarnoシステム内のすべてのカスタムプログラムとスクリプトに対してbash完了スクリプトをコーディングしましたが、上級開発者はそれらを
打ち倒し

@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. source .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

Russell E 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

より簡単な解決策は、nullglobオプションを使用することです。これは移植性がありませんが、どちらもbash補完ではありません。したがって、移植性は重要ではありません。

また、ソーシングするときに変数を引用符で囲みます。これは、ファイルに他の特殊文字の他のスペースがある場合を処理します。

shopt -s nullglob

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

1
nullglob参考までに、表示されている(つまり)についての説明(またはドキュメントへのリンク)は読者にとって役立ちます。
コメットソング

1

少なくともbash-completion 2.8以降では、ローカルのBash補完をディレクトリに配置するオプションを有効にします

${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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.