Bashから環境変数をエクスポートすると、オートコンプリートは機能しません。

Bashから環境変数をエクスポートすると、オートコンプリートは機能しません。

MYPATH次の2つのパスを含む環境変数をエクスポートしたいとします。

  1. /フル/パス/to/fileA
  2. /他/すべて/パス/to/fileB

だから私はこれがbashで行われるべきだと思います:

$export MYPATH=/full/path/to/fileA:/another/full/path/to/fileB

私が直面する問題は、TabコマンドにパスAを書き込むときにオートコンプリート(キー)が機能しますが、:その後はオートコンプリートが機能しなくなるため、オートコンプリートなしでコンソールにパスBを書き込むのが難しいということです。

驚くべきことに、次の条件が満たされると機能します。

  • コロンの代わりにセミコロンを使用しましたが、とにかく正しいパス区切り文字ではありません。
  • 私はrootユーザーです。

誰でもこの動作の理由を説明できますか?

  • Bashバージョン:GNU bash、バージョン4.3.48(1)-リリース(x86_64-pc-linux-gnu)
  • Bash 完成版: all/xenial-updates 1:2.1-4.2ubuntu1.1
  • オペレーティングシステムのバージョン:Ubuntu 16.04.6 LTS

ベストアンサー1

説明されている動作は、次のために発生する可能性があります。バッシュ完了

(次は現在のパッケージバージョン(2.9)に基づいていますが、使用しているバージョン2.1ではかなり正確です。)

bash-completionは一連の完了仕様を提供します(比較的標準化)、Bashのコマンドに引数として与えられた単語を完成させるためにReadlineライブラリで使用されます。それらは以下を使用して定義されます。complete 組み込みコマンド、通常は次の形式です。

complete -F function command

export組み込み関数の場合、その関数_exportはに定義されています/usr/share/bash-completion/completions/export

完成する単語にが含まれているかで終わる場合は、ファイルまたはディレクトリ名で完成を試みます=_export実際には最初の右側の部分=)。完成する単語にが含まれていない場合は、=完成を試みます。変数名に。 Readlineライブラリは、変数にリストされている文字の1つ(文字がエスケープされていない限り)(通常は含まれています)に遭遇するたびにCOMP_WORDBREAKS新しい補完を開始するため、:変数値Workに追加された最初のコロン以降は補完が停止します。 、要点は、完成する単語がaを含むか終了しなくなることです=。 (ただし、書いてクリックすると
ファイル/ディレクトリ名の完成が再開されますのでご注意ください。)export myvar=/usr/:othervar=Tab

bash-completionには特別なケースを処理する独自のメカニズムがあります。たとえば、これはコロンの右側の内容をリモートパスとして解釈する:compspec forによって正しく処理されます。scpただし、同様に適用されませんexport

読書船基本動作、現在のコマンドのcompspecが見つからないときにトリガされ、最終的にファイル名の完成を試みます。これがbash-completionがインストールされていないか無効になっているときに完了が機能する理由ですpath2(各コロンが新しい完了を開始することを覚えておいてください)。export var=/path1/:/path2/

では、何ができますか?いくつかの選択肢があります。

  1. 機能リクエストの送信対象:GitHubのbash完成

  2. 独自の完成機能を定義してくださいexport
    まず、compspecをユーザー補完ファイルにコピーします(まだ存在しない場合があります)。

    $ cat /usr/share/bash-completion/completions/export >>~/.bash_completion
    

    次に、を編集して~/.bash_completioncomplete -F _export export変更しますcomplete -F _export -o default exportexportこれは、特定のコンポーネントが結果を提供しないときにデフォルトの補完を試みるようにReadlineに指示します。

  3. bash-completionが提供する完成の代わりにデフォルトの完成を使用してください。
    以下に追加します~/.bashrc

    complete -o default -o bashdefault export
    

    (の提案Bash 完成に関するよくある質問)。欠点は、変数名とexportオプションを完成できないことです。

  4. bashの完成に十分なことを知るには、_export(2)のように提供された関数を編集して特別なものにし、独自の関数を定義してください:

おすすめ記事