2016-10-17 2 views
1

В настоящее время я пытаюсь выполнить простую команду echo в Golang на Linux. Мой код выглядит следующим образом:Команда Echo в Golang

cmd = exec.Command("echo", "\"foo 0x50\"", ">", "test.txt") 

_, err = cmd.Output() 

if err != nil { 
    fmt.Println(err) 
} 

Но test.txt не появляется в моей папке (даже после компиляции и запуска кода). Это не первое, что я использую этот метод для выполнения команд, и я никогда не думал, что буду блокировать команду echo.

Итак, как я могу исправить этот код, чтобы иметь «foo 0x50» (с кавычками) в test.txt?

благодарит заранее!

ответ

3

Вы можете перенаправить стандартный вывод, как это:

// Remove the redirect from command 
cmd := exec.Command("echo", "\"foo 0x50\"") 

// Make test file 
testFile, err := os.Create("test.txt") 
if err != nil { 
    panic(err) 
} 
defer outfile.Close() 

// Redirect the output here (this is the key part) 
cmd.Stdout = testFile 

err = cmd.Start(); if err != nil { 
    panic(err) 
} 
cmd.Wait() 
+0

Хорошо! но почему я не могу сделать это на одной линии, как я пытался в начале? – Majonsi

+2

@Majonsi, вроде да - вам просто нужно знать, что эти '' '', '' '' '' '' 'и т. Д. Интерпретируются вашей * shell, * и ядром ОС, в которые вытесняются' exec.Cmd.Run' спецификация процесса ничего не знает о них. Таким образом, один из способов иметь это «в одной строке» - это exec '/ bin/sh -c 'echo blah blah> file.txt", так что не '/ bin/echo' порождается, а оболочка, которая затем сообщается для выполнения определенного скрипта. Оболочка анализирует это перенаправление из сценария и организует их. – kostix

+2

@Majonsi, обратите внимание, что, хотя это будет работать, вам нужно подумать * трижды * (или более), прежде чем наступить на этот маршрут: как только вам нужно будет закодировать некоторые данные, которые могут содержать одиночные или двойные кавычки или символы перенаправления или что-то еще введите цитату ада. Гораздо хуже ситуация, когда вам нужно перейти к команде, в которой вы выполняете некоторые данные, полученные от пользователя: вы должны * должным образом * защитить его от интерпретации оболочки, а это означает, что блуждание по этому коллирующему аду является сундуком -дип в нем. Лучше не делать, действительно. – kostix