저는 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에 지시합니다(기본값).