You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
cointop/vendor/github.com/creack/pty/README.md

108 lines
2.3 KiB
Markdown

4 years ago
# pty
Pty is a Go package for using unix pseudo-terminals.
## Install
3 years ago
```sh
go get github.com/creack/pty
```
## Examples
4 years ago
3 years ago
Note that those examples are for demonstration purpose only, to showcase how to use the library. They are not meant to be used in any kind of production environment.
4 years ago
### Command
```go
package main
import (
"io"
"os"
"os/exec"
3 years ago
"github.com/creack/pty"
4 years ago
)
func main() {
c := exec.Command("grep", "--color=auto", "bar")
f, err := pty.Start(c)
if err != nil {
panic(err)
}
go func() {
f.Write([]byte("foo\n"))
f.Write([]byte("bar\n"))
f.Write([]byte("baz\n"))
f.Write([]byte{4}) // EOT
}()
io.Copy(os.Stdout, f)
}
```
### Shell
```go
package main
import (
"io"
"log"
"os"
"os/exec"
"os/signal"
"syscall"
"github.com/creack/pty"
3 years ago
"golang.org/x/term"
4 years ago
)
func test() error {
// Create arbitrary command.
c := exec.Command("bash")
// Start the command with a pty.
ptmx, err := pty.Start(c)
if err != nil {
return err
}
// Make sure to close the pty at the end.
defer func() { _ = ptmx.Close() }() // Best effort.
// Handle pty size.
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGWINCH)
go func() {
for range ch {
if err := pty.InheritSize(os.Stdin, ptmx); err != nil {
log.Printf("error resizing pty: %s", err)
}
}
}()
ch <- syscall.SIGWINCH // Initial resize.
3 years ago
defer func() { signal.Stop(ch); close(ch) }() // Cleanup signals when done.
4 years ago
// Set stdin in raw mode.
3 years ago
oldState, err := term.MakeRaw(int(os.Stdin.Fd()))
4 years ago
if err != nil {
panic(err)
}
3 years ago
defer func() { _ = term.Restore(int(os.Stdin.Fd()), oldState) }() // Best effort.
4 years ago
// Copy stdin to the pty and the pty to stdout.
3 years ago
// NOTE: The goroutine will keep reading until the next keystroke before returning.
4 years ago
go func() { _, _ = io.Copy(ptmx, os.Stdin) }()
_, _ = io.Copy(os.Stdout, ptmx)
return nil
}
func main() {
if err := test(); err != nil {
log.Fatal(err)
}
}
```