2016-06-29 2 views
1

golang 프로그램에서 bufio.Reader의 Os.Stdin 입력을 읽습니다.Golang - Os.stdin 입력을 읽지 만 반향 출력하지 않습니다.

입력을 누르면 프로그램이 입력을 읽은 다음 콘솔에 인쇄됩니다. 콘솔에 입력 내용을 인쇄 할 수 있습니까? 그것을 읽은 후에, 나는 입력을 처리하고 그것을 다시 인쇄한다 (더 이상 원래 입력이 필요 없다).

inputReader := bufio.NewReader(os.Stdin) 
for { 
    outgoing, _ := inputReader.ReadString('\n') 
    outs <- outgoing 
} 

답변

2

내가 터미널을 지우고 제 1 열로 귀하의 경우 (특정 위치로 커서를 이동 ANSI escape codes를 사용하는 것보다 다른 방법을 생각할 수 없다 :

는이 같은 데이터를 읽어 행을 1). 여기
var screen *bytes.Buffer = new(bytes.Buffer) 
var output *bufio.Writer = bufio.NewWriter(os.Stdout) 

그리고

터미널과 협력 작업을 쉽게하기 위해 몇 가지 기본적인 도우미 메서드입니다.

// Move cursor to given position 
func moveCursor(x int, y int) { 
    fmt.Fprintf(screen, "\033[%d;%dH", x, y) 
} 

// Clear the terminal 
func clearTerminal() { 
    output.WriteString("\033[2J") 
} 

그런 다음 함수 내에서 터미널을 지우고 커서를 터미널 창의 첫 번째 열과 첫 번째 행으로 이동해야합니다. 결국 계산 된 결과를 출력해야합니다.

for { 
    outgoing, err := input.ReadString('\n') 

    if err != nil { 
     break 
    } 

    if _, err := fmt.Sscanf(outgoing, "%f", input); err != nil { 
     fmt.Println("Input error!") 
     continue 
    } 

    // Clear console 
    clearTerminal() 
    moveCursor(1,1) 

    fmt.Println(outs) // prints the computed result 
} 
1

에코를 사용하지 않으려면 터미널 관련 기능을 찾고있는 것 같습니다. 이것은 대개 단말기에 암호를 쓸 때 사용됩니다 (입력 할 수는 있지만 문자는 표시되지 않습니다).

terminal.ReadPassword으로 시도해 보시길 권장합니다. 아마도 가장 교차 플랫폼 호환 방식으로 작동해야합니다.

prompt := "" 
t := terminal.NewTerminal(os.Stdin, prompt) 
for { 
    outgoing, err := t.ReadPassword(prompt) 
    if err != nil { 
     log.Fatalln(err) 
    } 
    outs <- outgoing 
} 
+0

Go 생성 된 .exe를 Cygwin 또는 Msys2 bash 프롬프트에서 실행하면 Windows에서 작동하지 않습니다. 다른 방법이 있습니까? – GodEater

+0

@GodEater Go 라이브러리에 버그가 있거나 Cygwin 또는 Msys2가 Windows에서 bash를 구현하는 방법에 버그가 있습니다. 그 외에 나는 단서가 없다, 미안. – toqueteos

0

crypto/ssh/terminal을 제외하고;

package main 

import (
    "bufio" 
    "fmt" 
    "os" 
    "os/exec" 
) 

func raw(start bool) error { 
    r := "raw" 
    if !start { 
     r = "-raw" 
    } 

    rawMode := exec.Command("stty", r) 
    rawMode.Stdin = os.Stdin 
    err := rawMode.Run() 
    if err != nil { 
     return err 
    } 

    return rawMode.Wait() 
} 

// http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html 
func main() { 
    var rs []rune 
    raw(true) 
    for { 
     inp := bufio.NewReader(os.Stdin) 
     r, _, err := inp.ReadRune() 
     if err != nil { 
      raw(false) 
      panic(err) 
     } 

     if r == '\x03' { // ctrl+c 
      break 
     } else if r == '\r' { // enter 
      fmt.Print(string(rs), "\n\r") 
      rs = []rune{} 
      continue 
     } else if r == '\u007f' { // backspace 
      fmt.Printf("\033[1D\033[K") 
      continue 
     } 

     rs = append(rs, r) 
    } 

    raw(false) 
}