Bash Completeは単語の後にスペースを追加します。これをどのように停止できますか?

Bash Completeは単語の後にスペースを追加します。これをどのように停止できますか?

私はPythonを使用して完了結果を提供するBash用のタブ補完スクリプトを作成しています。私が経験している問題を示すためにダミースクリプトを使用していますが、内容は重要ではありません。

dothat次のコードを含むBashスクリプトがあります。

var=$1
echo "You have chosen $var"

dothatまた、次のタブ補完を生成するスクリプトもありますdothat-completion.bash

_comp_func()
{
    COMPREPLY=()

    # Gets the output of a Python file and puts it into a variable
    fruits=$(python fruit.py)

    COMPREPLY=($(compgen -W "${fruits[*]}" -- $cur)) 
}

complete -F _comp_func dothat

そして(簡単な)内容は次のとおりですfruit.py

print('fruit:', end='')

Pythonスクリプトは単にSTDOUTに文字列を印刷してから、Bashコンプリート機能によってキャプチャされ、タブ補完の可能な一致を生成するために使用されます。

さて、このスクリプトでやりたいことは、入力すると最後に空白なしでdothat <TAB>完了することです。dothat fruit:問題は、私が入力してTabを押すと、不要な末尾のスペースでdothat 完了することです。dothat fruit:

Pythonの内容を次のように変更しようとしましたが、すべての結果は同じです。

print('"fruit:"', end='')
print("'fruit:'", end='')
print('fruit:', end='')
print("fruit:", end='')
print("fruit: ", end='')
print("fruit:          ", end='')
print('fruit')

でも:

foo='fruit'
print(foo)

そして私の試みはすべて同じ結果を得たので無駄だった。文字列にスペースが0、1、20個あるかどうかは関係ありません。 Pythonが文字列を出力しfruit:てBashコンプリートスクリプトに戻すと、空白で完了することにcompgenなります。fruit:

ここに私が逃した確かな解決策はありますか? BashやPythonの場合?

ベストアンサー1

これは、正確に一致する項目が見つかったときのデフォルトの動作であり、completeスペースを追加して行に追加の入力を許可して単語が完了したことを示します。これには単語が1つしかないので、その単語をすべて読んだCOMPREPLYときです。TAB

-o nospaceこのデフォルトの動作をオーバーライドするには、.fromを使用できますman bashbuiltins

スペースなし行末で完成した単語の後にスペースを追加しないようにreadlineに指示します(デフォルト)。

おすすめ記事