go tty

Obtener tamaño de terminal en Go



tty (4)

Estaba atrapado en un problema similar. Aquí es con lo que terminé.

No utiliza un subproceso, por lo que puede ser deseable en algunas situaciones.

import ( "syscall" "unsafe" ) type winsize struct { Row uint16 Col uint16 Xpixel uint16 Ypixel uint16 } func getWidth() uint { ws := &winsize{} retCode, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(syscall.Stdin), uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(ws))) if int(retCode) == -1 { panic(errno) } return uint(ws.Col) }

¿Cómo obtener tty size con Golang? stty size hacer esto ejecutando el comando stty size , pero no puedo crear el código correctamente.

package main import ( "os/exec" "fmt" "log" ) func main() { out, err := exec.Command("stty", "size").Output() fmt.Printf("out: %#v/n", out) fmt.Printf("err: %#v/n", err) if err != nil { log.Fatal(err) } }

Salida:

out: []byte{} err: &exec.ExitError{ProcessState:(*os.ProcessState)(0xc200066520)} 2013/05/16 02:35:57 exit status 1 exit status 1

Creo que esto se debe a que Go genera un proceso no relacionado con el tty actual, con el que está funcionando. ¿Cómo puedo relacionar el comando con el terminal actual para obtener su tamaño?


Funciona si le da al proceso secundario acceso al stdin los padres:

package main import ( "os/exec" "fmt" "log" "os" ) func main() { cmd := exec.Command("stty", "size") cmd.Stdin = os.Stdin out, err := cmd.Output() fmt.Printf("out: %#v/n", string(out)) fmt.Printf("err: %#v/n", err) if err != nil { log.Fatal(err) } }

Rendimientos:

out: "36 118/n" err: <nil>


Si alguien está interesado, hice un paquete para hacer esto más fácil.

https://github.com/wayneashleyberry/terminal-dimensions

package main import ( "fmt" terminal "github.com/wayneashleyberry/terminal-dimensions" ) func main() { x, _ := terminal.Width() y, _ := terminal.Height() fmt.Printf("Terminal is %d wide and %d high", x, y) }


Solo quería agregar una nueva respuesta ya que recientemente me encontré con este problema. Hay un paquete de terminal que se encuentra dentro del paquete oficial ssh https://godoc.org/golang.org/x/crypto/ssh/terminal .

Este paquete proporciona un método para obtener fácilmente el tamaño de un terminal.

width, height, err := terminal.GetSize(0)

0 sería el descriptor de archivo del terminal del que desea el tamaño. Para obtener el fd o su terminal actual, siempre puede hacer int(os.Stdin.Fd())

Debajo de las cubiertas, utiliza un syscall para obtener el tamaño del terminal para el fd dado.