Выложить различий с перенаправлением ввода в Голанге - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь выложить что-то похожее на:

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), но я получил ту же ошибку.

Есть идеи?

1 Ответ

0 голосов
/ 26 октября 2018

Здесь самое простое решение, просто передайте команду diff в bash shell:

    cmd := exec.Command(
        "bash", "-c", 
        fmt.Sprintf("diff <(echo -e %s) <(echo -e %s)", str1, str2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...