package module
Version: v1.1.1 Latest Latest

This package is not in the latest version of its module.

Go to latest
Published: Jan 13, 2018 License: MIT Imports: 6 Imported by: 886



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


go get


package main

import (

func main() {
	c := exec.Command("grep", "--color=auto", "bar")
	f, err := pty.Start(c)
	if err != nil {

	go func() {
		f.Write([]byte{4}) // EOT
	io.Copy(os.Stdout, f)
package main

import (


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.

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

        // Copy stdin to the pty and the pty to stdout.
        go func() { _, _ = io.Copy(ptmx, os.Stdin) }()
        _, _ = io.Copy(os.Stdout, ptmx)

        return nil

func main() {
        if err := test(); err != nil {



Package pty provides functions for working with Unix terminals.



This section is empty.


View Source
var ErrUnsupported = errors.New("unsupported")

ErrUnsupported is returned if a function is not available on the current platform.


func Getsize

func Getsize(t *os.File) (rows, cols int, err error)

Getsize returns the number of rows (lines) and cols (positions in each line) in terminal t.

func InheritSize added in v1.1.0

func InheritSize(master, slave *os.File) error

InheritSize applies the terminal size of master to slave. This should be run in a signal handler for syscall.SIGWINCH to automatically resize the slave when the master receives a window size change notification.

func Open

func Open() (pty, tty *os.File, err error)

Opens a pty and its corresponding tty.

func Setsize added in v1.1.0

func Setsize(t *os.File, ws *Winsize) error

Setsize resizes t to s.

func Start

func Start(c *exec.Cmd) (pty *os.File, err error)

Start assigns a pseudo-terminal tty os.File to c.Stdin, c.Stdout, and c.Stderr, calls c.Start, and returns the File of the tty's corresponding pty.


type Winsize added in v1.1.0

type Winsize struct {
	Rows uint16 // ws_row: Number of rows (in cells)
	Cols uint16 // ws_col: Number of columns (in cells)
	X    uint16 // ws_xpixel: Width in pixels
	Y    uint16 // ws_ypixel: Height in pixels

Winsize describes the terminal size.

func GetsizeFull added in v1.1.0

func GetsizeFull(t *os.File) (size *Winsize, err error)

GetsizeFull returns the full terminal size description.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
t or T : Toggle theme light dark auto
y or Y : Canonical URL