通过 "os/exec", 调用系统命令echo,并重定向到文件,结果出问题

modaoshi3002 2014-04-22 01:56:42
本意是通过os/exec,调用系统命令 echo "hello world" > test.txt , 把字符串写进文件。
但是运行时却直接打印到了屏幕。
请问有朋友能解决吗?


//通过调用 echo "hello world" > test.txt , 把字符串写进文件。
text := "hello world"
cmd := exec.Command(
"echo",
text,
">",
"test.txt")

fmt.Println(cmd.Args) //这里可以看出, golang把echo后面的参数都连了起来,成为了一个字符串。

o, err = cmd.Output()
if err != nil {
fmt.Println(err)
}

...全文
1377 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
modaoshi3002 2014-04-28
  • 打赏
  • 举报
回复
非常感谢两位~
modaoshi3002 2014-04-28
  • 打赏
  • 举报
回复 2
非常感谢各位, 谢谢。 我最终选取的做法类似svenwang的:

o, err = exec.Command(
		"bash",
		"-c",
		"echo helloasfasf > test.txt").Output()
if err != nil {
	fmt.Println("---: ", err)
}
飃颻 2014-04-25
  • 打赏
  • 举报
回复
运行结果是正确了! 但是这种设计方法,不如直接使用"echo hello world > test.txt"来的简单。
svenwang 2014-04-25
  • 打赏
  • 举报
回复
引用 9 楼 svenwang 的回复:
因为执行echo命令是平台相关的操作,所以在windows和linux下Go语言的实现是不同的。
在linux下也可以换一种实现方式:把cmd命令换成sh或者bash命令来启动一个控制台程序:

package main
  
import (
    "bytes"
    "fmt"
    "os/exec"
)
  
func main() {
    in := bytes.NewBuffer(nil)
    cmd := exec.Command("sh")
    cmd.Stdin = in
    go func() {
        in.WriteString("echo hello world > test.txt\n")
        in.WriteString("exit\n")
    }()
    if err := cmd.Run(); err != nil {
        fmt.Println(err)
        return
    }
}
svenwang 2014-04-25
  • 打赏
  • 举报
回复
因为执行echo命令是平台相关的操作,所以在windows和linux下Go语言的实现是不同的。
svenwang 2014-04-25
  • 打赏
  • 举报
回复
引用 7 楼 mingxyzonline 的回复:
"echo hello world > test.txt" 的运行结果没有问题。 GO语言如果不能在程序中实现,那么只能用批处理命令来实现。
如果想在windows下实现这个需求,可以启动一个cmd,然后把要执行的命令作为标准输入传给它,然后再把exit命令传给它结束进程。 这样:

package main
 
import (
	"bytes"
    "fmt"
    "os/exec"
)
 
func main() {
	in := bytes.NewBuffer(nil)
    cmd := exec.Command("cmd")
	cmd.Stdin = in
	go func() {
		in.WriteString("echo hello world > test.txt\n")
		in.WriteString("exit\n")
	}()
    if err := cmd.Run(); err != nil {
		fmt.Println(err)
		return
	}
}
飃颻 2014-04-25
  • 打赏
  • 举报
回复
"echo hello world > test.txt" 的运行结果没有问题。 GO语言如果不能在程序中实现,那么只能用批处理命令来实现。
svenwang 2014-04-25
  • 打赏
  • 举报
回复
引用 5 楼 mingxyzonline 的回复:
[quote=引用 4 楼 svenwang 的回复:] 我当然执行过。你是在windows下执行的吗?echo命令在windows下没有的。你试试在linux下执行。
"echo"是Cmd窗口的标准命令,"echo hello world"命令回显"hello world",你可以试一试。 [/quote] 你说的对,windows下确实有echo命令,但windows下的echo是控制台的一个内置命令,而不是一个可执行文件,所以在windows下执行是失败的。会报告错误“exec: "echo": executable file not found in %PATH%”。 exec.Command只使用于可执行文件命令。
飃颻 2014-04-25
  • 打赏
  • 举报
回复
引用 4 楼 svenwang 的回复:
我当然执行过。你是在windows下执行的吗?echo命令在windows下没有的。你试试在linux下执行。
"echo"是Cmd窗口的标准命令,"echo hello world"命令回显"hello world",你可以试一试。
svenwang 2014-04-25
  • 打赏
  • 举报
回复
引用 3 楼 mingxyzonline 的回复:
[quote=引用 2 楼 svenwang 的回复:] 应该打开一个文件test.txt作为命令"echo "hello world""的标准输出和错误输出:

package main

import (
	"fmt"
	"os"
	"os/exec"
)

func main() {
	f, err := os.OpenFile("test.txt", os.O_CREATE|os.O_WRONLY, 0777)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()
	cmd := exec.Command(
		"echo", "hello world")
	cmd.Stdout = f
	cmd.Stderr = f //可选
	cmd.Start()
}
楼上,是否执行过你的小程式? 我执行的结果text.txt文件的确是生成了,但文件内一片空白。[/quote] 我当然执行过。你是在windows下执行的吗?echo命令在windows下没有的。你试试在linux下执行。
飃颻 2014-04-25
  • 打赏
  • 举报
回复
引用 2 楼 svenwang 的回复:
应该打开一个文件test.txt作为命令"echo "hello world""的标准输出和错误输出:

package main

import (
	"fmt"
	"os"
	"os/exec"
)

func main() {
	f, err := os.OpenFile("test.txt", os.O_CREATE|os.O_WRONLY, 0777)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()
	cmd := exec.Command(
		"echo", "hello world")
	cmd.Stdout = f
	cmd.Stderr = f //可选
	cmd.Start()
}
楼上,是否执行过你的小程式? 我执行的结果text.txt文件的确是生成了,但文件内一片空白。
svenwang 2014-04-25
  • 打赏
  • 举报
回复
引用 13 楼 mingxyzonline 的回复:
[quote=引用 12 楼 svenwang 的回复:] 你也可以说用ruby一行代码就搞定了。。。。但这里不是go论坛么
非常感谢您的精彩解答,正所谓“条条大道通罗马”,真理可能不是唯一的。[/quote] 那直接打开编辑器,输入“hello world”,保存成test.txt文件就可以了。
飃颻 2014-04-25
  • 打赏
  • 举报
回复
引用 12 楼 svenwang 的回复:
你也可以说用ruby一行代码就搞定了。。。。但这里不是go论坛么
非常感谢您的精彩解答,正所谓“条条大道通罗马”,真理可能不是唯一的。
svenwang 2014-04-25
  • 打赏
  • 举报
回复
引用 11 楼 mingxyzonline 的回复:
运行结果是正确了! 但是这种设计方法,不如直接使用"echo hello world > test.txt"来的简单。
你也可以说用ruby一行代码就搞定了。。。。但这里不是go论坛么 `echo hello world>test.txt`
svenwang 2014-04-22
  • 打赏
  • 举报
回复
应该打开一个文件test.txt作为命令"echo "hello world""的标准输出和错误输出:

package main

import (
	"fmt"
	"os"
	"os/exec"
)

func main() {
	f, err := os.OpenFile("test.txt", os.O_CREATE|os.O_WRONLY, 0777)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer f.Close()
	cmd := exec.Command(
		"echo", "hello world")
	cmd.Stdout = f
	cmd.Stderr = f //可选
	cmd.Start()
}
飃颻 2014-04-22
  • 打赏
  • 举报
回复
源文件 prntext.go ... text := "hello world" fmt.println(text) ... 运行 go run prntext.go >text.txt

2,190

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • Freeman Z
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧