は、ファイル内のbash補完スクリプトを含む、asdf-completion
と呼ばれる持って言う:
_asdf() {
COMPREPLY=()
local cur prev
cur=$(_get_cword)
COMPREPLY=($(compgen -W "one two three four five six" -- "$cur"))
return 0
}
complete -F _asdf asdf
これは架空のasdf
コマンドの補完を提供するために、シェルの機能_asdf
を使用しています。適切な環境変数(bashのmanページから)を設定すると、同様の結果が得られます。これは潜在的な展開をCOMPREPLY
変数に置くことです。
import subprocess
import unittest
class BashTestCase(unittest.TestCase):
def test_complete(self):
completion_file="asdf-completion"
partial_word="f"
cmd=["asdf", "other", "arguments", partial_word]
cmdline = ' '.join(cmd)
out = subprocess.Popen(['bash', '-i', '-c',
r'source {compfile}; COMP_LINE="{cmdline}" COMP_WORDS=({cmdline}) COMP_CWORD={cword} COMP_POINT={cmdlen} $(complete -p {cmd} | sed "s/.*-F \\([^ ]*\\) .*/\\1/") && echo ${{COMPREPLY[*]}}'.format(
compfile=completion_file, cmdline=cmdline, cmdlen=len(cmdline), cmd=cmd[0], cword=cmd.index(partial_word)
)],
stdout=subprocess.PIPE)
stdout, stderr = out.communicate()
self.assertEqual(stdout, "four five\n")
if (__name__=='__main__'):
unittest.main()
これは-F
を使用するすべての補完のために働く必要がありますが、同様に他の人のために働くことがあります。ここでは、unittestの中にいることをやっての例です。
je4dさんのコメントexpect
は、より完全なテストのための良い1つです。
ない下に配置され
[本](HTTP ://stackoverflow.com/questions/3520936/accesssing-bash-completions-for-specific-commands-programmatically)は役に立ちますか?私はそれを自分で試していない。 – Vikas
ユーザインタラクションをシミュレートしたい場合、 'expect'はあなたの友人です - あなたのfs/envをpythonでセットアップし、サブプロセスを使ってexpectスクリプト内からbashを実行してください。エスケープは難しいかもしれませんが、そうでなければかなり簡単です。 – je4d