Giả sử bạn có một kịch bản bash hoàn thành trong một tập tin gọi là asdf-completion
, bao gồm:
_asdf() {
COMPREPLY=()
local cur prev
cur=$(_get_cword)
COMPREPLY=($(compgen -W "one two three four five six" -- "$cur"))
return 0
}
complete -F _asdf asdf
này sử dụng hàm vỏ _asdf
để cung cấp hoàn cho hư cấu asdf
lệnh. Nếu chúng ta thiết lập các biến môi trường thích hợp (từ trang bash man), thì chúng ta có thể nhận được cùng một kết quả, đó là vị trí của các mở rộng tiềm năng vào biến số COMPREPLY
. Dưới đây là một ví dụ về làm điều đó trong một unittest:
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()
này nên làm việc cho bất kỳ hoàn sử dụng -F
, nhưng có thể làm việc cho người khác là tốt.
nhận xét của je4d để sử dụng expect
là cách tốt nhất để kiểm tra hoàn chỉnh hơn.
Liệu [này] (http : //stackoverflow.com/questions/3520936/accesssing-bash-completions-for-specific-commands-programmatically) giúp? Tôi đã không thử nó mặc dù bản thân mình. – Vikas
Nếu bạn muốn mô phỏng tương tác người dùng, 'expect' là bạn của bạn - hãy cài đặt fs/env của bạn trong python và sau đó chạy bash từ bên trong một kịch bản mong đợi với subprocess. Việc thoát có thể phức tạp, nhưng nếu không nó khá đơn giản. – je4d