在Golang中具有输入重定向的Shell out diff
我正试图推出类似的产品:在Golang中具有输入重定向的Shell out diff,shell,go,Shell,Go,我正试图推出类似的产品: diff <(echo -e "$string1" ) <(echo -e "$string2") 这会给我一些结果,比如:diff:\“foo\nbar\nbaz\”:没有这样的文件或目录 差异:“foo\n文件\nbaz\”:没有这样的文件或目录 更复杂的版本仍然不起作用: func Diff(str1, str2 string) (string, error) { cmd := exec.Command("diff") stdin,
diff <(echo -e "$string1" ) <(echo -e "$string2")
这会给我一些结果,比如:diff:\“foo\nbar\nbaz\”:没有这样的文件或目录
差异:“foo\n文件\nbaz\”:没有这样的文件或目录
更复杂的版本仍然不起作用:
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))
}
func Diff(str1,str2字符串)(字符串,错误){
cmd:=exec.Command(“diff”)
stdin,err:=cmd.StdinPipe()
如果错误!=零{
返回“”,错误
}
stdout,err:=cmd.StdoutPipe()
如果错误!=零{
返回“”,错误
}
err=cmd.Start()
如果错误!=零{
返回“”,错误
}
io.WriteString(标准输入法、echoString(标准输入法))
io.WriteString(标准输入法、echoString(标准输出法))
字节,错误:=ioutil.ReadAll(stdout)
cmd.Wait()
结果:=字符串(字节)
如果错误!=零{
开关错误。(类型){
案例*exec.exit:
返回结果,无
违约:
返回“”,无
}
}
返回结果,无
}
func echoString(str字符串)字符串{
返回fmt.Sprintf(`这里是最简单的解决方案,只需将diff
命令传递给bash
shell:
cmd := exec.Command(
"bash", "-c",
fmt.Sprintf("diff <(echo -e %s) <(echo -e %s)", str1, str2))
cmd:=exec.Command(
“bash”、“-c”,
fmt.Sprintf(“diff这里是最简单的解决方案,只需将diff
命令传递给bash
shell:
cmd := exec.Command(
"bash", "-c",
fmt.Sprintf("diff <(echo -e %s) <(echo -e %s)", str1, str2))
cmd:=exec.Command(
“bash”、“-c”,
fmt.Sprintf(“diff如果您粘贴代码和错误消息,我们可能可以帮助您更好地添加我尝试过的最简单的版本。diff命令需要文件作为其参数,而不仅仅是字符串,所以这就是为什么您会得到错误的原因我知道,我也不希望简单的版本能够工作,但我在stdin上做了手脚,可以找不到在Go中对shell输入重定向进行编码的方法。第二个版本的问题是如果您粘贴代码和错误消息,我们可能可以帮助您更好地添加我尝试过的最简单的版本。嗯,diff命令希望将文件作为其参数,而不仅仅是字符串,所以这就是为什么您会遇到错误gettingI知道,我也不希望这个简单的版本能够工作,但是我在stdin上做了手脚,找不到在Go中编写shell输入重定向的方法。第二个版本的问题是Ah,聪明!我只是将整个diff命令作为字符串传递给bash。很好的发现!啊,聪明!我只是将整个diff命令作为字符串传递给bash哦,巴什,很好的发现!