MCPcopy Index your code
hub / github.com/creack/pty

github.com/creack/pty @v1.1.24

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.1.24 ↗ · + Follow
122 symbols 235 edges 53 files 24 documented · 20% 128 cross-repo links
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

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. If you want to set deadlines to work and Close() interrupting Read() on the returned *os.File, you will need to call syscall.SetNonblock manually.

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)
        }
}

Core symbols most depended-on inside this repo

ioctl
called by 19
ioctl.go
GetsizeFull
called by 6
winsize_unix.go
_IOC
called by 4
ioctl_bsd.go
ioctlInner
called by 4
ioctl_inner.go
Open
called by 3
doc.go
fcntl
called by 3
pty_zos.go
Setsize
called by 3
winsize_unix.go
cInt8ToString
called by 2
pty_openbsd.go

Shape

Function 78
TypeAlias 30
Struct 14

Languages

Go100%

Modules by API surface

pty_zos.go8 symbols
pty_solaris.go8 symbols
doc_test.go8 symbols
ioctl_bsd.go6 symbols
pty_dragonfly.go5 symbols
helpers_test.go5 symbols
pty_freebsd.go4 symbols
pty_darwin.go4 symbols
winsize_unsupported.go3 symbols
winsize_unix.go3 symbols
pty_netbsd.go3 symbols
pty_linux.go3 symbols

For agents

$ claude mcp add pty \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact