2016-01-20 177 views
1

我試圖使用基本bash命令read從鍵盤捕獲單個字符。但是,即使我嘗試了幾種方法,也很難獲得輸出結果。無法從Golang運行bash`read`命令

示例代碼:

fmt.Println(exec.Command("read", "-t", "5", "-n", "1").Output()) 

它的意思是「等待5秒鐘就可以從鍵盤1個輸入字符」。從上面的代碼我希望看到我輸入的字符一起打印出來與它的錯誤,但我會得到什麼是

輸出:

[] exit status 1 

這個輸出只是立即較小超過1秒,其衝突到"-t", "5"印刷指示等待5秒鐘的指令read。我嘗試在1秒內鍵入一些字符,但似乎根本不起作用。

順便說一句,如果嘗試這種

fmt.Println(exec.Command("echo", "\"Hi!\"").Output()) 

輸出:

[34 104 105 34 10] <nil> 

在這裏簡單echo在這裏似乎工作。

+0

閱讀是一個bash命令,而不是您的PATH中的可執行文件,如echo。也許調用內部bash的內容可能會起作用。我建議找一個Go-Only解決方案。 – Volker

+0

@Volker我只是想捕獲'空格鍵'這就是全部。你有任何建議,只需一個簡單的唯一解決方案? – fronthem

回答

1

你不提供帶有標準輸入的命令,所以沒有任何東西可以讀取並立即退出。

如果你想要把它掛在同一標準輸入作爲調用程序,你可以使用:

cmd := exec.Command("read", "-t", "5", "-n", "1") 
cmd.Stdin = os.Stdin 
out, err := cmd.CombinedOutput() 

fmt.Println("error:", err) 
fmt.Printf("output: %q\n", out) 

然而,這不會輸出任何東西,因爲/usr/bin/read腳本是不會打印出任何東西。您可能想要在shell的上下文中調用shell內建的read。這會打印出讀到的字符:

cmd := exec.Command("bash", "-c", "read -t 5 -n 1 C && echo -n $C") 
cmd.Stdin = os.Stdin 

但最後,您應該直接從stdin中讀取。

+0

感謝您的回答@JimB。我試過了你的代碼,聽起來不錯,但是我每次輸入都從「out」中得到「」。 – fronthem

+0

@ terces907:這是因爲'read'不打印任何輸出。你想做什麼? – JimB

+0

我只想得到給定的輸入字符。 – fronthem