Как напрямую вызвать системную оболочку в Go (golang)? - PullRequest
0 голосов
/ 28 марта 2020

Согласно документации 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?

1 Ответ

1 голос
/ 28 марта 2020

Второй аргумент должен быть одной строкой. В команде оболочки вам также нужно передать ее как одну строку. Также ~ интерпретируется как bash. Вы можете смело предположить, что sh существует. Bash оболочка не обязательна.

package main                                                                                                                                                              

import (                                                                                                                                                                  
 "fmt"                                                                                                                                                                    
 "os/exec"                                                                                                                                                                
)                                                                                                                                                                         

func main() {                                                                                                                                                             
 exec.Command("sh", "-c", "echo Hello >> ~/thing").Run()                                                                                                                  
 cmdOut, _ := exec.Command("sh", "-c", "cat ~/thing").Output()                                                                                                            
 fmt.Println(cmdOut)                                                                                                                                                      
}
...