Согласно документации golang, go не выполняет вызов системной оболочки при использовании exe c .Command ().
Из документации golang .org для пакета "os / exe c":
В отличие от вызова библиотеки "system" из C и других языков, пакет os / exe c преднамеренно не вызывает системную оболочку и не раскрывает никаких шаблонов глобусов и не обрабатывает другие расширения, конвейеры или перенаправления, обычно выполняемые оболочками.
Это создает проблему. Из-за этого выбора дизайна вы не можете использовать трубопровод при выполнении команды. Поэтому следующий код не выполняется должным образом.
package main
import (
"fmt"
"os/exec"
)
func main() {
exec.Command("echo", "Hello", ">>", "~/thing").Run()
cmdOut, _ := exec.Command("cat", "~/thing").Output()
fmt.Println(cmdOut)
}
Вместо того, чтобы распечатывать содержимое файла, который должен содержать слово «Hello», вместо этого он печатает пустую новую строку. Я попытался напрямую вызвать bash, например, так:
package main
import (
"fmt"
"os/exec"
)
func main() {
exec.Command("bash", "-c", "echo", "Hello", ">>", "~/thing").Run()
cmdOut, _ := exec.Command("cat", "~/thing").Output()
fmt.Println(cmdOut)
}
Это, однако, дает тот же результат, что и исходный код. Как я могу напрямую вызвать системную оболочку при использовании golang?