여기에 무슨 일이 일어나고 있는지 이해하기 위해 그 bash는 기능이 실제로 무엇을하는지 확인하자 :
COMPREPLY=($(\
COMP_LINE=$COMP_LINE COMP_POINT=$COMP_POINT \
COMP_WORDS="${COMP_WORDS[*]}" COMP_CWORD=$COMP_CWORD \
OPTPARSE_AUTO_COMPLETE=1 $1))
가 마지막에 $1
를 참조하십시오? 즉, 실제로 특수한 환경 변수를 설정하여 실행하고자하는 Python 파일을 호출합니다!
이
$ ./test.py [tab]
called with args: ['./test.py']
...
COMP_CWORD: 1
COMP_LINE: ./test.py
COMP_POINT: 10
COMP_WORDS: ./test.py
...
OPTPARSE_AUTO_COMPLETE: 1
...
autocomplete tried to exit with status 1
autocomplete tried to write to STDOUT:
-o -h -s -p --script --simple --help --output
그래서 optcomplete.autocomplete
단지 환경을 읽고 준비 :
#!/usr/bin/env python2
import os, sys
import optparse, optcomplete
from cStringIO import StringIO
if __name__ == '__main__':
parser = optparse.OptionParser()
parser.add_option('-s', '--simple', action='store_true',
help="Simple really simple option without argument.")
parser.add_option('-o', '--output', action='store',
help="Option that requires an argument.")
opt = parser.add_option('-p', '--script', action='store',
help="Option that takes python scripts args only.")
opt.completer = optcomplete.RegexCompleter('.*\.py')
# debug env variables
sys.stderr.write("\ncalled with args: %s\n" % repr(sys.argv))
for k, v in sorted(os.environ.iteritems()):
sys.stderr.write(" %s: %s\n" % (k, v))
# setup capturing the actions of `optcomplete.autocomplete`
def fake_exit(i):
sys.stderr.write("autocomplete tried to exit with status %d\n" % i)
sys.stdout = StringIO()
sys.exit = fake_exit
# Support completion for the command-line of this script.
optcomplete.autocomplete(parser, ['.*\.tar.*'])
sys.stderr.write("autocomplete tried to write to STDOUT:\n")
sys.stderr.write(sys.stdout.getvalue())
sys.stderr.write("\n")
opts, args = parser.parse_args()
이것은 우리가 그것을 자동 완성하려고 할 때 다음과 같은 우리에게 제공 : 무슨 일이 일어나고 있는지 추적하기 위해,이 optcomplete.autocomplete
가 무엇을 차단하기 위해 약간의 스크립트를 준비하자 성냥은 그들을 STDOUT에 쓰고 종료합니다. 그런 다음 -o -h -s -p --script --simple --help --output
결과는 bash h 열 (COMPREPLY=(...)
)에 넣고 bash로 리턴하여 사용자에게 선택 사항을 제공합니다. 어떤 마법도 포함되어 있지 않습니다 :)
'optcomplet'문서에서는 "Bash 함수를 소스로 사용하고 Bash가이를 사용하는 특정 프로그램에 대한 완전한 완성을 트리거하도록 지시해야합니다 :". 네가 그렇게했다면 왜 아직도 어떻게 작동하는지 묻는거야? 완성을 요청할 경우 bash에게 어떤 프로그램을 호출해야하는지 분명히 밝혀야합니다. –
죄송합니다, 나는 내가 읽은 것을 오해했습니다. 나는 그것에 대한 답을 추가 할 것이다. –