LINUX.ORG.RU

Go, stdout и exec

 , ,


0

1

Приветствую.

Имеется тестовая программа:

package main

import (
	"fmt"
	"os/exec"
)

func main() {
	test := exec.Command ("grep", "referer", "wgetm").Output()
	fmt.Println (test)
}

Но она не выполянется:

./test.go:9: multiple-value exec.Command("grep", "referer", "wgetm").Output() in single-value context

И как это исправить? Гугл не помог.

//Собственно, мне нужно просто-напросто заполучить вывод grep в [inlnie]test[/test] в данном случае. На Stackoverflow есть пример с os.Stdout, но он усложнён и не работает так, как нужно, поэтому я решил использовать exec.Command.Output()



Последнее исправление: CYB3R (всего исправлений: 4)

//зарабатываем скор вместе
функция возвращает несколько значений, а ты принимаешь только одно.

Bad_ptr ★★★★★
()

Я о-о-очень давно ковырял Go, но там разве не две переменные возвращаются обычно? Попробуй

test, err := *код*

Но это я по памяти, да и не писал на нём почти ничего.

Lilly
()

Гугл не помог.

первая же ссылка по «go exec» (оф документация): http://golang.org/pkg/os/exec/#Cmd.Output

func (c *Cmd) Output() ([]byte, error)

Output runs the command and returns its standard output.

▾ Example

package main

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

func main() {
	out, err := exec.Command("date").Output()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("The date is %s\n", out)
}

.Output() возвращает два значения.

arkhnchul ★★★
()
Ответ на: комментарий от Lilly

С этим:

package main

import (
	"fmt"
	"os/exec"
)

func main() {
	test, test2 := exec.Command ("grep", "referer", "wgetm").Output()
	fmt.Println (test, "\n")
	fmt.Println (test2)
}
Получается что-то невообразимое:

[32 32 32 32 32 32 32 45 45 114 101 102 101 114 101 114 61 85 82 76 32 32 32 32 32 32 32 32 32 32 32 208 178 208 186 208 187 209 142 209 135 208 184 209 130 209 140 32 208 178 32 72 84 84 80 45 208 183 208 176 208 191 209 128 208 190 209 129 32 208 183 208 176 208 179 208 190 208 187 208 190 208 178 208 190 208 186 32 96 82 101 102 101 114 101 114 58 32 85 82 76 39 46 10] 

<nil>
srm
() автор топика
Ответ на: комментарий от srm

test2 имеет смысл только проверять на равенство nil. Иди к учебнику.

UPD: массивы байтов, угу, значит я таки мало помню. Но совета это не отменяет.

Lilly
()
Последнее исправление: Lilly (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

О господи. Byte array. В перлике всё было проще.

Но большое спасибо за ответ, отмечаю проблему решённой.

srm
() автор топика
Ответ на: комментарий от Lilly

Go не виноват

вообще виноват. Что-то там с кодировками строк... Ну по дефолту там понятно утф-8 и для конвертации надо как-то через пакет byte извращаться, насколько помню(короче как-то неочевидно)

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от srm

а если посмотреть внимательно на пример из доки? Там какбе указано, что возврат - []byte, и выводят его fmt.Printf(«%s», out), а не fmt.Println (test2)

arkhnchul ★★★
()
Ответ на: комментарий от Bad_ptr

вообще виноват

Мне трудно судить, ибо тыкал в Go довольно давно, так что, вероятно, твоя правда.

Lilly
()
Ответ на: комментарий от Bad_ptr

вообще виноват. Что-то там с кодировками строк... Ну по дефолту там понятно утф-8 и для конвертации надо как-то через пакет byte извращаться, насколько помню(короче как-то неочевидно)

Короче не помнишь, там все очевидно.

korvin_ ★★★★★
()
Ответ на: комментарий от deterok

Кастани вывод примерно вот так string(byteArray[:n])

просто string(bytearray)

korvin_ ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.