Digamos que tiene un script bash-completado en un archivo llamado asdf-completion
, que contiene:
_asdf() {
COMPREPLY=()
local cur prev
cur=$(_get_cword)
COMPREPLY=($(compgen -W "one two three four five six" -- "$cur"))
return 0
}
complete -F _asdf asdf
Este utiliza la función Shell _asdf
para proporcionar terminaciones para el comando de ficción asdf
. Si establecemos las variables de entorno correctas (desde la página man de bash), podemos obtener el mismo resultado, que es la ubicación de las posibles expansiones en la variable COMPREPLY
. He aquí un ejemplo de hacer que en un 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()
Esto debería funcionar para cualquier terminaciones que utilizan -F
, pero puede funcionar para otros también.
comentario de je4d para usar expect
es uno bueno para una prueba más completa.
las hace [esto] (http : //stackoverflow.com/questions/3520936/accesssing-bash-completions-for-specific-commands-programmatically) ayuda? Aunque no lo he intentado solo. – Vikas
Si desea simular la interacción del usuario, 'expect' es su amigo: realice su configuración de fs/env en python y luego ejecute bash desde dentro de un script de espera con subproceso. El escape puede ser complicado, pero por lo demás es bastante sencillo. – je4d