3

異なるプロジェクト用に、異なるパスに同じファイル名の 2 つの別々のスクリプトがあります: /home/me/projects/alpha/bin/hithere/home/me/projects/beta/bin/hithere.

これに対応して、スクリプトごとに適切な補完が異なるため、2 つの別個の bash 補完スクリプトを用意しています。補完スクリプトでは、問題のスクリプトの完全な名前を指定して、補完ごとに「complete」コマンドが実行されます。

complete -F _alpha_hithere_completion /home/me/projects/alpha/bin/hithere

ただし、呼び出された実際のバージョンに関係なく、最後に実行されたスクリプトのみが効果があるhithereようです。bash の補完は、コマンドのファイル名のみを考慮し、パス情報を無視しているようです。

この動作を変更して、これら 2 つの独立したスクリプトを同じ名前で、それぞれ異なる補完関数を持つようにする方法はありますか?

アルファがベータについて知ることを必要とするソリューション、またはそれらのいずれかを知るために 3 番目のコンポーネントを必要とするソリューションには興味がないことに注意してください。

4

2 に答える 2

0

はい、可能です。しかし、それは少しトリッキーです。私が開発している将来のスクリプトの概念にこれを使用しています。すべてのスクリプトはビルド スクリプトと同じ名前ですが、それでも bash 補完はその仕事を行うことができます。

このために、私は 2 段階のプロセスを使用します。まず、メイン スクリプトを に配置し~/.config/bash_completion.dます。このスクリプトは、特定の共有スクリプト名のすべてのスクリプトをカバーするように設計されています。~/.bashrcこれらのスクリプトの bash 補完ファイルをロードするように構成しました。

スクリプトは、bash で補完したい特定のスクリプト ファイルの完全なファイル パスを取得します。このパスから識別子を生成します。この識別子には、実際の bash 完了データを提供するファイルが存在します。そのため、bash 補完が実行されると、メインの bash 補完スクリプトからの bash 補完関数がそのファイルをチェックし、そのコンテンツをロードします。その後、通常の bash 完了操作が続行されます。

同じ名前の 2 つのスクリプトがある場合、これらのスクリプトは同じ名前を共有しているがパスが異なるため、2 つの異なる識別子があります。したがって、bash の完了には 2 つの異なる構成を使用できます。

このコンセプトは魅力のように機能します。


注: この回答をすぐに更新して、いくつかのソース コードを提供します。

于 2021-03-11T19:51:03.347 に答える