17

Java プログラム用の Bash 補完スクリプトを作成しようとしています。そのプログラムの典型的な呼び出しは、次のようになります。

$ javaProgram -Dproperty=foo option1 option2

私のスクリプトの一部は、このプログラムで使用できるさまざまな Java プロパティを提案することです (つまり、ユーザーがを入力-Dすると、スクリプトは を提案し、property=ユーザーが値を入力できるようにします)。

等号の後にスペースを挿入しないように補完してください。ただし、ユーザーがプログラムのさまざまなオプションを入力している場合 (上記の例option1option2は)、スクリプトで補完を行い、完了時にスペースを挿入したいと思います。

私は Bash 補完スクリプトを初めて使用しますが、シェル組み込みのnospaceオプションを認識しています。completeただし、ビルトインでは機能しないようcompgenです。これは、私が望むもののようです。を使用して、適切なオプションの最後にスペースを明示的に含めようとしましnospaceたが、うまくいかないようです。

いくつかのオプションの最後にスペースを取得する方法を知っている人はいますが、他のオプションの最後にスペースはありませんか?

4

6 に答える 6

7

対応するオプションでスペースを削除してから、必要なオプションに手動でスペースを追加し直すことでそれを行うことができます。すべて単純な-W(「単語リスト」) 補完を使用します。

complete -o nospace -W 'Dproperty= "option1 " "option2 "' javaProgram

オートコンプリートは、 と の後にスペースを挿入するようにoption1なりましoption2たが、 の後には挿入しませんDproperty=

于 2016-09-29T19:32:05.297 に答える
6

追加されたスペースを保持する C4H5As によって言及された scp の bash 補完の機能は、アンパサンドではありません。これは、「一致で置換」の sed 構文です。

compgen がスペースではなく改行またはタブで入力を分割するように、IFS を変更する必要があります。

local IFS=$'\t\n'
COMPREPLY=( $(compgen -W "$options" -- $cur) )
于 2012-08-29T12:41:12.170 に答える
1

Dennis はその通りです。あなたが で参照する関数では、次のcomplete -F _your_funcようなものが必要です (/etc/bash_completion から取得):

    # escape spaces; remove executables, aliases, pipes and sockets;
    # add space at end of file names
    COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \
               command ls -aF1d "$path*" 2>/dev/null | \
               sed -e "s/[][(){}<>\",:;^&!$&=?\`|\\ ']/\\\\\\\\\\\\&/g" \
               -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' ) )
    return 0

この特定の例では-o nospaceオプションを使用していますが、手動でスペースを追加しています。-e ('s/[^\/]$/& /g')スペースを追加するのは最後です。この場合、最後のパラメーターがスラッシュで終わっていない場合にのみ追加されます (これはディレクトリであり、オートコンプリートするファイルがあります)。

主な違いは、スペースの前にアンパサンドを追加しているようです。それを試して、それが機能するかどうかを確認してください。

于 2010-02-26T08:20:14.437 に答える
1

これまでのコードを参照していただけると助かります。

ただし、ある場合はscpinの完了コードを見てください。/etc/bash_completion.d/sshローカル ファイル名の後にスペースを挿入しますが、ホスト名の後には挿入しません。

于 2010-02-26T06:42:22.667 に答える