Bashがいくつかのコマンドに対してオートコンプリートを無効にする理由とそれを有効にする方法は?

Bashがいくつかのコマンドに対してオートコンプリートを無効にする理由とそれを有効にする方法は?

特定のコマンドに対してオートコンプリートを無効にするbashに頻繁にアクセスします。これにより、コマンド名にランダムな記号を追加し、オートコンプリートを使用してコマンド名を変更する必要があります。これは非常に迷惑なことです。たとえば、

# I type:
openvpn s<tab>
# Nothing happens, so I add x
openvpnx s<tab>
# Now this expands to
openvpnx somepath

# Same with ./configure or many other commands...

オートコンプリートが常に機能するように無効化機能を無効にする方法はありますか?

答え1

上場完了の状況

Bash / Readlineがコマンドを完了するために使用していることがわかりますcomplete -p command。たとえば、実行complete -p openvpnすると

bash: complete: openvpn: no completion specification

これは、私のシェルが使用するReadlineに特定のコマンド補完機能がないため、デフォルトではファイル名である従来のopenvpn補完形式を使用することを意味します。

別の例(定義完了デモンストレーション):

$ complete -p dillo
complete -F _filedir_xspec dillo

これは、名前付き関数がコマンド補完を_filedir_xspec提供するために使用されることを示しますdillo

完了したコンテンツを削除

定義された完成を削除するには、組み込みオプションを使用-rしますcomplete

complete -r openvpn

答え2

バッシュプログラム可能な完成。 1999年から、ファイル名の完成ではなくコマンド引数の完成を調整できるようになりました。コマンド固有の補完が構成されていない場合、ファイル名はデフォルト値です。したがって、コマンドをに変更するとファイル名が取得されますopenvpnx

プログラム可能な完成は通常/etc/bash_completion。プログラム可能な完成がまったく必要なく、ファイル名がわからない状況でも常にファイル名を完成させるには.bashrc

openvpnコマンド引数にカスタム補完機能があるようですが、この補完コードは最初の引数には何も提供しません。なぜこれが起こるのかわかりません。完了コードのバグかもしれません。便利な完了コードの完全なオプションとその引数です。complete -p openvpnパラメータを完了するためにどのコードが呼び出されるかを確認するには、実行してくださいopenvpn。を使用してこのカスタム補完コードを無効にすることはできますがcomplete -r openvpn、それはファイル名でのみ返されます。これは、openvpnいくつかのオプションの後のコマンドラインでのみ役立ちます。

完了設定に関係なく、いつでも次のように呼び出してファイル名を完成させることができます。complete-filename(基本バインディング:)の代わりにM-/completeTAB

答え3

最初の問題は、openvpnバイナリファイル名がinit.dディレクトリのエントリと一致することです。

complete | grep -i openvpn

生産する

complete -F _service /etc/init.d/openvpn

Ubuntuおよびその派生製品では、これは/usr/share/bash-completion/bash_completion(パッケージの一部)bash-completionのコードに由来します。

for svcdir in ${sysvdirs[@]}; do
    for svc in $svcdir/!($_backup_glob); do
        [[ -x $svc ]] && complete -F _service $svc
    done
done

このブロックをコメントアウトしてください。 Bash インスタンスを再起動します。openvpnオートコンプリートのためにTABを試して実行してみてください。

complete | grep -i openvpn

これは

complete -F _openvpn /etc/init.d/openvpn

2番目の質問はから来ました/usr/share/bash-completion/completions/openvpn。 /etc/openvpn で .conf ファイルをオートコンプリートしようとしますが、これは /etc/openvpn の外部にあるいくつかの一時構成ファイルを使用して openvpn を実行しようとすると邪魔になることがあります。

削除して bash インスタンスを再起動します。

sudo rm /usr/share/bash-completion/completions/openvpn

openvpnコマンドの標準ファイル補完を取得するには、Tabキーを使用する必要があります。

走れば

complete -p | grep openvpn

openvpn以降にオートコンプリートしようとすると、次のメッセージが表示されます。

complete -F _minimal openvpn`

より良いアプローチは、openvpnのbash完了スクリプトを修正/拡張することです。しかし、それは別の日の物語です。


bash-completion後でパッケージの元の状態に戻すには、次のコマンドを使用して再インストールします。

apt-get install --reinstall bash-completion

答え4

私の答えの悲しい部分は、bashで(readlineを介して)完了する可能性が高いということです。ただし、一般的なLinuxディストリビューションでは、[tab](または[tab] [tab])を追加してデフォルトのファイル名拡張子を妨げる可能性があります。オプション拡張。私の場合パッケージ「bash-完成」これは元の質問で説明されている動作を提供します。

これは単なる質問ではありませんopenvpn。 Qは「例えば」と言いました。

私はbind -p | grep complete得る:

"\C-i": complete
"\e\e": complete
"\e!": complete-command
"\e/": complete-filename
...
"\e\C-i": dynamic-complete-history
"\eg": glob-complete-word
"\e*": insert-completions
# menu-complete (not bound)
...
"\C-x/": possible-filename-completions

ここはTAB=ctrl-i基本機能にバインドしますcomplete。私はArchlinuxで別のバインディングを試みました。 "ta[esc][star]" を使用すると、コマンドラインに "ta" で始まるすべてのコマンドを挿入できます。

readline機能はcompleteman bashで説明されています:

完了中

完了(タブ)

そのポイントより前のテキストに完成しようとします。 Bash はテキストを完全なものとして扱おうとします。変える (テキストが$で始まる場合)ユーザー名(テキストが〜で始まる場合)、ホスト名(テキストが@で始まる場合)、または注文する(エイリアスと関数を含む)順に。これらのいずれも一致しない場合、ファイル名 完了してみてください。

私はこれを部分的にしか再現できません。私の考えでは、man bashは、最初の単語を[タップ]するか、2番目、3番目などをタップするかによって異なることに言及することを忘れてしまったようです。

私の家/職場ディレクトリに「ba」で始まるファイルがあります。プロンプトで「ba [tab]」と入力すると、名前は表示されず、badblocksfromコマンドのみが表示されますbashbug。これは賢明な行動です。最初の単語はコマンドを提供し、次の単語はファイル名です。 「$[tab]」と入力すると、素晴らしい変数名のリストが表示されます。

実際、「タブ」とは「タブ」「タブ」を意味します。しかし、私たちはこれに慣れていて、この「完全な」readline関数が何をしているのかさえ気付かないでしょう。 「フル」バリアントを使用すると、検索対象(コマンド、ファイル名、変数)と複数の一致がある場合にリストがどのように処理されるか(可能性)を制御できます。

これらのreadline関数にはさまざまな基本的なバインディングがあります。リスト関数と基本バインディングのman bash両方。man readline確認するには、上記のバインド-pを使用してください。これはこの文書の基礎でもあります~/.inputrc。ちょうど1つ作成しました(神秘的な/etc/inputrcを使って):

set colored-completion-prefix on
set colored-stats on

カラー統計により、ls --color「bi[tab][tab]」の後に「bind」は白色で、「bison」は緑色で表示され、「bind」が実行可能ファイルではないことがわかります。組み込み...コマンド拡張です... "bind"はファイル名ではありません!)。

set show-all-if-ambiguous on

これはタブとダブルタブを制御します。追加して入力した後

cd s[tab]

すべてのファイル名のカラーリストを直接取得します。ディレクトリ、リンク、一般ファイルなどはすべて一意の色で表示されます。

これら行変数の読み取りbind -v.inputrc 変更をテストするには、「bash」を使用して新しい bash を起動して終了します。またはもう一度ログインしてください。

これ次のレベルにあります/usr/share/bash-completion

これには、主にutil-linuxおよびsystemdパッケージの各コマンドのスクリプトが含まれています。マウント(2Kb)およびsystemctl(13Kb)ファイルがあります。ファイルのマウントは面白いです。 「-t」と入力すると、/proc/filesystems が表示されます。

通常、「mount -t [tab]」の後にファイル名を取得します。 「マウント」ファイルを取得した後、ext2、ext3、ext4などのファイルシステムタイプを取得しました。私行く:

complete -r mount

この機能を削除してください。 (これはcompleteシェル組み込みコマンドです)

3番目のレイヤーは追加です。「bash 完成」パッケージ。テストのためにインストールしてから削除しました。このパッケージを使用すると、オプションとパッケージ名を拡張する素晴らしい機能を得ることができます。 「tar --[tab]」と入力すると、すべてのオプションが表示されます。しかし、ファイル名拡張子は多くの集合体にありません。 AMDはただのArchiLinuxにしかありません。

このbash-completionパッケージは、2000行のスクリプト「bash_completion」と多くのコマンドファイルを提供しました。 "tar"には700行のコードがあり、完全に動作します。したがって、この問題を解決することは解決策ではありません。

completeこの[タブ]のすべての詳細に本当に興味がある場合は、一番下から始めて[タブ]以外のキーにバインドされていない1つまたは2つのreadline関数を選択する必要があります。上記の基本構成は機能しますが、[tab]以外の構成は使用したことがありません。それでは、正しいキーに正しい機能を設定したいと思います。オプションを含めるか含まないで bash-completion パッケージを拡張します。

関連情報