Я пытаюсь выложить что-то похожее на:
diff <(echo -e "$string1" ) <(echo -e "$string2")
на Голанге, но все мои попытки с exec.Command
не увенчались успехом.
Вот самая наивная попытка, которую я имеюпопробовал (CombinedOutput
временно используется для определения основной проблемы):
func Diff(str1, str2 string) (string, error) {
cmd := exec.Command("diff", sanitize(str1), sanitize(str2))
bytes, err := cmd.CombinedOutput()
result := string(bytes)
if err != nil {
switch err.(type) {
case *exec.ExitError:
return result, nil
default:
return "", nil
}
}
return result, nil
}
, что дает мне такие результаты, как: diff: \"foo\nbar\nbaz\": No such file or directory
diff: \"foo\nfighters\nbaz\": No such file or directory
Более сложная версия все еще не работает:
func Diff(str1, str2 string) (string, error) {
cmd := exec.Command("diff")
stdin, err := cmd.StdinPipe()
if err != nil {
return "", err
}
stdout, err := cmd.StdoutPipe()
if err != nil {
return "", err
}
err = cmd.Start()
if err != nil {
return "", err
}
io.WriteString(stdin, echoString(str1))
io.WriteString(stdin, echoString(str2))
bytes, err := ioutil.ReadAll(stdout)
cmd.Wait()
result := string(bytes)
if err != nil {
switch err.(type) {
case *exec.ExitError:
return result, nil
default:
return "", nil
}
}
return result, nil
}
func echoString(str string) string {
return fmt.Sprintf(`<( echo -e "%s" )`, strings.Replace(str, `"`, `\"`, -1))
}
Нет выходных данных вообще, и я получаю diff: missing operand after `diff'
diff: Try `diff --help' for more information.
в stderr
.
Поэтому я подумал, что мне действительно не нужны инструкции echo
, потому что я уже получил строкипоэтому я попытался заменить реализацию echoString
только escape-частью, то есть return strings.Replace(str, `"`, `\"`, -1)
, но я получил ту же ошибку.
Есть идеи?