func StartWithAttrs(c *exec.Cmd, sz *Winsize, attrs *syscall.SysProcAttr) (pty *os.File, err error) {
	pty, tty, err := Open()
	if err != nil {
		return nil, err
	}
	defer tty.Close()
	if sz != nil {
		if err := Setsize(pty, sz); err != nil {
			pty.Close()
			return nil, err
		}
	}
	if c.Stdout == nil {
		c.Stdout = tty
	}
	if c.Stderr == nil {
		c.Stderr = tty
	}
	if c.Stdin == nil {
		c.Stdin = tty
	}
	c.SysProcAttr = attrs
	if err := c.Start(); err != nil {
		_ = pty.Close()
		return nil, err
	}
	return pty, err
}
StartWithAttrs 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.

This will resize the pty to the specified size before starting the command if a size is provided.
The `attrs` parameter overrides the one set in c.SysProcAttr.

This should generally not be needed. Used in some edge cases where it is needed to create a pty
without a controlling terminal.
package pty
import (
	"os"
	"os/exec"
	"syscall"
)
func Start(c *exec.Cmd) (pty *os.File, err error) {
	return StartWithSize(c, nil)
}
func StartWithSize(c *exec.Cmd, sz *Winsize) (pty *os.File, err error) {
	if c.SysProcAttr == nil {
		c.SysProcAttr = &syscall.SysProcAttr{}
	}
	c.SysProcAttr.Setsid = true
	c.SysProcAttr.Setctty = true
	return StartWithAttrs(c, sz, c.SysProcAttr)
}