Я пытаюсь выполнить команду с помощью go. Команда в строке.
package main
import (
"log"
"os"
"os/exec"
"strings"
"github.com/davecgh/go-spew/spew"
)
func main() {
commandToRun := `echo $HOME`
log.Printf("Running %s\n", commandToRun)
args := strings.Fields(commandToRun)
spew.Dump(args[1:len(args)])
command := exec.Command(args[0], args[1:len(args)]...)
command.Stdout = os.Stdout
command.Stdin = os.Stdin
command.Stderr = os.Stderr
err := command.Run()
if err != nil {
log.Printf("Command finished with error: %v", err)
}
}
Вывод:
2018/11/14 09:41:22 Running echo $HOME
([]string) (len=1 cap=1) {
(string) (len=5) "$HOME"
}
$HOME
Что бы я хотел иметь:
2018/11/14 09:41:22 Running echo $HOME
([]string) (len=1 cap=1) {
(string) (len=5) "$HOME"
}
/home/whatever
Похоже, что go как-то дезинфицирует строку. Таким образом, $HOME
не расширяется. Есть ли способ запустить строку точно так, как если бы она была введена в оболочку?
Это важная часть. В идеале я хотел бы перейти от строки к тексту в текущей оболочке.
РЕДАКТИРОВАТЬ: Пример ниже решает простейший сценарий, но не охватывает "запуск строки точно так, как если бы она была набрана в оболочке".
Если я переключусь на expandenv
:
commandToRun := os.ExpandEnv(`echo "$HOME"`)
Я получаю:
2018/11/14 11:45:44 Running echo "/Users/rafael"
([]string) (len=1 cap=1) {
(string) (len=15) "\"/home/whatever\""
}
"/home/whatever"
В оболочке я получу:
$ > echo "$HOME"
/home/whatever
без кавычек.
Это близко к тому, что я хочу, но не совсем так.