Bash 완료는 단어 뒤에 공백을 추가합니다. 이를 어떻게 중지할 수 있습니까?

Bash 완료는 단어 뒤에 공백을 추가합니다. 이를 어떻게 중지할 수 있습니까?

저는 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, 공백을 추가하고 줄에 추가 입력을 허용하여 단어가 완료되었음을 나타냅니다. 여기에는 단어가 하나만 있으므로 해당 단어를 다 읽었을 COMPREPLY때입니다 .TAB

-o nospace이 기본 동작을 재정의하려면 .from을 사용할 수 있습니다 man bashbuiltins.

공간 없음줄 끝에서 완성된 단어 뒤에 공백을 추가하지 않도록 readline에 지시합니다(기본값).

관련 정보