環境

環境

Bashのプログラマブルコンプリート機能を調査していますが、よく理解できない部分があります。

環境

bash --version端末で実行すると、このような結果が出ます。

GNU bash, version 5.1.16(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

私はこれをすべて運営しています。Ubuntu 22.04.2 LTS

2つのファイルがあります。

ファイル1(スクリプト)

最初は、次のようにプログラムで実行したいスクリプトです。

#!/usr/bin/env bash
#Script: dothis
echo "COMMAND: $0 $@"

ご覧のとおり、これはスクリプト名とパラメータを印刷するダミースクリプトです。

ファイル2(プログラミング可能完了スクリプト)

2番目のファイルは、以下のように、前のスクリプトのプログラム可能な完了を担当するファイルです。

#!/usr/bin/env bash

_dothis_completions(){
    # -S suffix
    COMPREPLY=($(compgen -A user -S '_suffix'  "${COMP_WORDS[1]}"))

    # -P prefix
    #COMPREPLY=($(compgen -A user -P 'prefix_'  "${COMP_WORDS[1]}"))
}

 complete -F _dothis_completions dothis

オプション(提案項目にサフィックスを追加)と組み合わせて使用​​すると、うまく機能-Sします。これはシステム内のさまざまなユーザーの提案を提供し、_suffix最後に添付されます。

プログラムを完了するためのスクリプトを次のように変更すると、次のようになります。

#!/usr/bin/env bash

_dothis_completions(){
    # -S suffix
    #COMPREPLY=($(compgen -A user -S '_suffix'  "${COMP_WORDS[1]}"))

    # -P prefix
    COMPREPLY=($(compgen -A user -P 'prefix_'  "${COMP_WORDS[1]}"))
}

 complete -F _dothis_completions dothis

(このフラグを使用してすべての提案に-Pプレフィックスを追加したいです)prefix_

コマンドラインでもう一度試しましたが、これはうまくいきません。

なぜこれがうまくいかないのか知っている人はいますか?

よろしくお願いします!

更新済み(2023年7月29日)

私はZshでBashのプログラム可能な完成機能を使うことにしましたが、問題なく動作しているようです。

この情報は、Bashで「-P」フラグが正しく機能しない理由に対する答えを見つけるのに役立つことを願っています。

答え1

問題は、compgen -P ...これが1つのオプションしか残っていない場合にのみ意味があるようです。たぶん、完成を作成するときにプレフィックスを削除してこの問題を解決することもできます。

私の提案は、入力された項目があること、完了した項目が1つだけ残っていることを確認することです。これは、一方が別の値の最初の部分である2つの値では機能しない可能性があります。

  • 金持ち
  • プヴァ

fooそれでは選択の余地はありません。

_dothis_completions(){

    local -a tmp_array=()

    # -S suffix
    #COMPREPLY=($(compgen -A user -S '_suffix'  "${COMP_WORDS[1]}"))

    # -P prefix
    if [ -z "${COMP_WORDS[COMP_CWORD]}" ]; then
        COMPREPLY=($(compgen -A user "${COMP_WORDS[1]}"))
    else
        tmp_array=( $(compgen -A user "${COMP_WORDS[1]}") )
        if [ "${#tmp_array[@]}" -eq 1 ]; then
            COMPREPLY=($(compgen -A user -P 'prefix_'  "${COMP_WORDS[1]}"))
        else
            COMPREPLY=($(compgen -A user "${COMP_WORDS[1]}"))
        fi
    fi
}

complete -F _dothis_completions dothis

関連情報