gexpect

Pure golang expect library, for easily starting and controlling subprocesses

Github stars Tracking Chart

Gexpect

Gexpect is a pure golang expect-like module.

It makes it simpler to create and control other terminal applications.

child, err := gexpect.Spawn("python")
if err != nil {
	panic(err)
}
child.Expect(">>>")
child.SendLine("print 'Hello World'")
child.Interact()
child.Close()

Examples

Spawn handles the argument parsing from a string

child.Spawn("/bin/sh -c 'echo \"my complicated command\", tee log, cat > log2'")
child.ReadLine() // ReadLine() (string, error)
child.ReadUntil(' ') // ReadUntil(delim byte) ([]byte, error)

ReadLine, ReadUntil and SendLine send strings from/to stdout/stdin respectively

child, _ := gexpect.Spawn("cat")
child.SendLine("echoing process_stdin") //  SendLine(command string) (error)
msg, _ := child.ReadLine() // msg = echoing process_stdin

Wait and Close allow for graceful and ungraceful termination.

child.Wait() // Waits until the child terminates naturally.
child.Close() // Sends a kill command

AsyncInteractChannels spawns two go routines to pipe into and from stdout/stdin, allowing for some usecases to be a little simpler.

child, _ := gexpect.Spawn("sh")
sender, receiver := child.AsyncInteractChannels()
sender <- "echo Hello World\n" // Send to stdin
line, open := <- receiver // Recieve a line from stdout/stderr
// When the subprocess stops (e.g. with child.Close()) , receiver is closed
if open {
	fmt.Printf("Received %s", line)
}

ExpectRegex uses golang's internal regex engine to wait until a match from the process with the given regular expression (or an error on process termination with no match).

child, _ := gexpect.Spawn("echo accb")	
match, _ := child.ExpectRegex("a..b")
// (match=true)

ExpectRegexFind allows for groups to be extracted from process stdout. The first element is an array of containing the total matched text, followed by each subexpression group match.

child, _ := gexpect.Spawn("echo 123 456 789")
result, _ := child.ExpectRegexFind("\d+ (\d+) (\d+)")
// result = []string{"123 456 789", "456", "789"}

See gexpect_test.go and the examples folder for full syntax

Credits

github.com/kballard/go-shellquote	
github.com/kr/pty
KMP Algorithm: "http://blog.databigbang.com/searching-for-substrings-in-streams-a-slight-modification-of-the-knuth-morris-pratt-algorithm-in-haxe/"

Main metrics

Overview
Name With OwnerThomasRooney/gexpect
Primary LanguageGo
Program languageGo (Language Count: 1)
Platform
License:MIT License
所有者活动
Created At2014-01-20 19:16:22
Pushed At2018-06-23 17:08:12
Last Commit At2017-01-01 01:01:23
Release Count0
用户参与
Stargazers Count269
Watchers Count10
Fork Count79
Commits Count73
Has Issues Enabled
Issues Count18
Issue Open Count12
Pull Requests Count13
Pull Requests Open Count3
Pull Requests Close Count4
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private