Linux(Suse)マシンへのユーザーアクセス(ルートなし)があり、bashスクリプトと対応するbashオートコンプリートルールを開発しました。
スクリプトは自分のユーザーのみに属しているため、完全なルールが必要なのは「アクティブ」であるだけなので(ルート書き込みアクセス権がないという事実からの一部です)、bash_completionスクリプトを/etc/bash_completion.d/
フォルダに配置することはできませんオプション。
現時点では、ファイルに.bash_completion.myscript
という名前を付けて.bashrc
から直接ソースを提供していますが、これらの結果を達成するための「標準」の方法が他にあるかどうかは、bash実装ですでに検討されています。
たとえば、フォルダ/home/myuser/.bash_completion.d/
?を作成します。
使う ~/.bash_completion
ファイル。
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/
ディレクトリを持つ方法は次のとおりです。
ファイルを編集:nano ~/.bash_completion
、以下を追加:
for bcfile in ~/.bash_completion.d/* ; do . $bcfile done
ディレクトリを作成:mkdir ~/.bash_completion.d
ファイルを編集:~/.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
ソース.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
少なくとも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
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
より簡単な解決策は、nullglobオプションを使用することです。これは移植可能ではありませんが、bash補完も同様です。したがって、移植性は重要ではありません。
また、ソーシングするときは、変数を引用符で囲みます。これは、ファイルに他の特殊文字が含まれる場合に対処します。
shopt -s nullglob
for f in ~/.bash_completion.d/*; do
[ -f "$f" ] && . "$f"
done