web-dev-qa-db-ja.com

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

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

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

現時点では、ファイルに.bash_completion.myscriptという名前を付けて.bashrcから直接ソースを提供していますが、これらの結果を達成するための「標準」の方法が他にあるかどうかは、bash実装ですでに検討されています。

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

48
Carles Sala

使う ~/.bash_completionファイル。

Bash Completion FAQ から:

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

A.それらを〜/ .bash_completionに入れます。これは、
メイン完了スクリプト。次の質問も参照してください。

Q.パッケージXを作成または保守していて、自分のものを保守したい
このパッケージの完了コード。どこに置けばいいですか
そのインタラクティブなbashシェルはそれを見つけてソースしますか?

A.が指すディレクトリの1つにインストールします
bash-completionのpkgconfigファイル変数。二つあります
代替案:推奨されるものは「completionsdir」です(
"pkg-config --variable = completionsdir bash-completion")から
完了は、呼び出されたコマンドの名前に基づいてオンデマンドでロードされます。
それに応じて補完ファイルに名前を付けて、
たとえば、ファイルが補完を提供する場合のシンボリックリンク
複数のコマンド用。存在するもう一方
後方互換性の理由は「compatdir」です
"pkg-config --variable = compatdir bash-completion")どのファイルから
bash_completionが読み込まれるときに読み込まれます。

ローカルユーザーが作業用の~/.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. ソース.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
51
Russell E Glaue

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

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

完了ファイル名またはシンボリックリンク名は、それぞれのコマンド名と一致する必要があります。これらの補完はオンデマンドでのみロードされます。 fileに保存されている補完~/.bash_completionは常に読み込まれます。

参照:「Q.自分のローカル補完をどこにインストールすればよいですか?」を参照してください。で https://github.com/scop/bash-completion/blob/master/README.md

3
jarno

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
2

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

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

shopt -s nullglob

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