2014-07-16 16 views
0

我正在寫一個機器人在進入播放音樂,而且我有一些麻煩這個bash shell的工作菌種的bash shell中轉到

proc := exec.Command("/bin/bash") 
stdin, errIn := proc.StdinPipe() 
stdout, errOut := proc.StdoutPipe() 
WriteAndWait(stdin, stdout, "cd /home/user/bot1337/") 
WriteAndWait(stdin, stdout, "rm song.mp3") 
WriteAndWait(stdin, stdout, "youtube-dl --extract-audio --audio-format mp3 " + Sanitize(command[1])) 
WriteAndWait(stdin, stdout, "mv *.mp3 song.mp3") 
WriteAndWait(stdin, stdout, "xmms2 play song.mp3") 
WriteAndWait(stdin, stdout, "quit") 

的WriteAndWait功能

func WriteAndWait(stdout io.Writer, stdin io.Reader, command string) { 
    stdout.Write([]byte(command + "; echo -e '\\x63\\x68\\x65\\x63\\x6b'\r\n")) 
    buf := make([]byte, 256) 
    for { 
     fmt.Println("Reading...") 
     rlen, _ := stdin.Read(buf) 
     strin := string(buf[:rlen]) 
     fmt.Println(strin) 
     if strings.Contains(strin, "check") { 
      return 
     } 
    } 
} 

該過程被創建,但程序掛在Read()上 - 它永遠不會讀取標準輸入中的任何東西

在此先感謝您的幫助!

+1

你爲什麼使用'\ r \ n',這是windows行結尾,而不是Linux。 – OneOfOne

+0

哦,我會改變它 – dreadiscool

回答

1

你忘了開始你的過程。 exec.Command創建過程對象,但不啓動它。

只需在你的pipe init之後加上proc.Start()就可以了。

+0

啊,謝謝!我認爲exec.Command已經開始了這個過程,並且.Run()會強制它阻塞,直到程序結束。我不知道你應該用.Start()開始它。謝謝! – dreadiscool