При использовании exec.Command
для запуска другой команды, которая выводит цвет, например,
func main() {
c := exec.Command("node-gyp", "rebuild")
c.Stdin = os.Stdin
c.Stdout = os.Stdout
c.Stderr = os.Stderr
c.Run()
}
, она работает как ожидается и выводит цветной текст на терминал, например:
Однако, рассмотрим, хотим ли мы также захватить выходной поток для дальнейшего использования. Мы могли бы сделать что-то вроде этого (цветной вывод на stderr):
func main() {
c := exec.Command("node-gyp", "rebuild")
c.Stdin = os.Stdin
c.Stdout = os.Stdout
var buf bytes.Buffer
c.Stderr = io.MultiWriter(os.Stderr, &buf)
c.Run()
// do something with buf
}
Теперь все в черно-белом:
Это вызывает два вопроса:
- Что здесь происходит? Как простой акт по существу выполнения
tee
в потоке Writer может привести к исчезновению терминальных цветов (которые, как я предполагаю, являются символами UTF-8)? - Если вместо этого вы используете
exec.Command("ls", "--color")
, цвета появляются в обоих случаях. Почему цвета здесь работают, а не для node-gyp rebuild
? Если они кодируются по-разному, в чем разница?