David Karlsson b4c0941683 tests: add basic build progress test
Signed-off-by: David Karlsson <35727626+dvdksn@users.noreply.github.com>
..
.gitignore tests: add basic build progress test
Dockerfile.golang tests: add basic build progress test
Dockerfile.riscv tests: add basic build progress test
LICENSE tests: add basic build progress test
README.md tests: add basic build progress test
asm_solaris_amd64.s tests: add basic build progress test
doc.go tests: add basic build progress test
ioctl.go tests: add basic build progress test
ioctl_bsd.go tests: add basic build progress test
ioctl_solaris.go tests: add basic build progress test
ioctl_unsupported.go tests: add basic build progress test
mktypes.bash tests: add basic build progress test
pty_darwin.go tests: add basic build progress test
pty_dragonfly.go tests: add basic build progress test
pty_freebsd.go tests: add basic build progress test
pty_linux.go tests: add basic build progress test
pty_netbsd.go tests: add basic build progress test
pty_openbsd.go tests: add basic build progress test
pty_solaris.go tests: add basic build progress test
pty_unsupported.go tests: add basic build progress test
run.go tests: add basic build progress test
start.go tests: add basic build progress test
start_windows.go tests: add basic build progress test
test_crosscompile.sh tests: add basic build progress test
winsize.go tests: add basic build progress test
winsize_unix.go tests: add basic build progress test
winsize_unsupported.go tests: add basic build progress test
ztypes_386.go tests: add basic build progress test
ztypes_amd64.go tests: add basic build progress test
ztypes_arm.go tests: add basic build progress test
ztypes_arm64.go tests: add basic build progress test
ztypes_dragonfly_amd64.go tests: add basic build progress test
ztypes_freebsd_386.go tests: add basic build progress test
ztypes_freebsd_amd64.go tests: add basic build progress test
ztypes_freebsd_arm.go tests: add basic build progress test
ztypes_freebsd_arm64.go tests: add basic build progress test
ztypes_freebsd_ppc64.go tests: add basic build progress test
ztypes_loong64.go tests: add basic build progress test
ztypes_mipsx.go tests: add basic build progress test
ztypes_netbsd_32bit_int.go tests: add basic build progress test
ztypes_openbsd_32bit_int.go tests: add basic build progress test
ztypes_ppc64.go tests: add basic build progress test
ztypes_ppc64le.go tests: add basic build progress test
ztypes_riscvx.go tests: add basic build progress test
ztypes_s390x.go tests: add basic build progress test

README.md

pty

Pty is a Go package for using unix pseudo-terminals.

Install

go get github.com/creack/pty

Examples

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.

Command

package main

import (
	"io"
	"os"
	"os/exec"

	"github.com/creack/pty"
)

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

package main

import (
        "io"
        "log"
        "os"
        "os/exec"
        "os/signal"
        "syscall"

        "github.com/creack/pty"
        "golang.org/x/term"
)

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.
        defer func() { signal.Stop(ch); close(ch) }() // Cleanup signals when done.

        // Set stdin in raw mode.
        oldState, err := term.MakeRaw(int(os.Stdin.Fd()))
        if err != nil {
                panic(err)
        }
        defer func() { _ = term.Restore(int(os.Stdin.Fd()), oldState) }() // Best effort.

        // Copy stdin to the pty and the pty to stdout.
        // NOTE: The goroutine will keep reading until the next keystroke before returning.
        go func() { _, _ = io.Copy(ptmx, os.Stdin) }()
        _, _ = io.Copy(os.Stdout, ptmx)

        return nil
}

func main() {
        if err := test(); err != nil {
                log.Fatal(err)
        }
}