如何将bash exec.Command的返回值转换为数组?

huangapple go评论79阅读模式
英文:

How can I turn bash exec.Command returns into Arrays?

问题

我正在尝试找到以hello.go结尾的文件。

statement := "find "CurrentDirectory" -print | grep -i hello.go"
result, error := exec.Command("bash", "-c", statement).Output()

这给我一个包含2个文件路径的列表,我尝试将它们转换为我可以单独访问的数组:

Directory_array := strings.Split(string(result),"\n")

fmt.Println(len(Directory_array))

数组的长度显示为"3",但除了第0个位置外,数组是空的。

这些代码行独立工作,但是一起使用时不起作用。如何使数组填充为单独的路径?

英文:

I'm trying to find files that end in hello.go

statement:= "find "CurrentDirectory" -print | grep -i hello.go"
result, error := exec.Command("bash", "-c", statement).Output()

This gives me a list containing 2 file paths and I try to turn them into arrays that I can individually address using:

Directory_array := strings.Split(string(result),"\n")

fmt.Println(len(Directory_array) )

The length of the array shows as "3" but the array is empty except for the 0th position.

Independently the code lines work but not together. How can I get the array to fill with individual paths?

答案1

得分: 2

在你的情况下,使用strings.FieldsFunc而不是strings.Split。例如:

statement := "find . -print | grep -i hello"
result, err := exec.Command("bash", "-c", statement).Output()
if err != nil {
    panic(err)
}

ds := strings.FieldsFunc(string(result), func(r rune) bool {
    return r == '\n'
})
for i, d := range ds {
    fmt.Println(i, d)
}

进一步阅读:

  1. strings.FieldsFunc - go.dev
  2. strings.FieldsFunc vs strings.Split - Medium
英文:

In your case, use strings.FieldsFunc instead of strings.Split. For example:

statement:= "find . -print | grep -i hello"
result, err := exec.Command("bash", "-c", statement).Output()
if err != nil {
	panic(err)
}

ds := strings.FieldsFunc(string(result), func(r rune) bool {
	return r == '\n'
})
for i, d := range ds {
	fmt.Println(i, d)
}

Further reading:

  1. strings.FieldsFunc - go.dev
  2. strings.FieldsFunc vs strings.Split - Medium

答案2

得分: 0

你可以使用stdout管道,并使用Scanner逐行读取。

func main() {
    cmd := exec.Command("ls", "-l")
    out, _ := cmd.StdoutPipe()
    s := bufio.NewScanner(out)

    cmd.Start()
    defer cmd.Wait()

    for s.Scan() {
        fmt.Println("new line:")
        fmt.Println(s.Text())
    }
}

如果你想将其存储到一个切片中,你可以事先创建切片并将其追加到其中。

lines := make([]string, 0, 10)
for s.Scan() { lines = append(lines, s.Text()) }
英文:

You could use the stdout pipe and read line by line using a Scanner.

func main() {
	cmd := exec.Command("ls", "-l")
	out, _ := cmd.StdoutPipe()
	s := bufio.NewScanner(out)

	cmd.Start()
	defer cmd.Wait()

	for s.Scan() {
		fmt.Println("new line:")
		fmt.Println(s.Text())
	}
}

If you want to store this into a slice, you can create the slice beforehand and append to it.

lines := make([]string, 0, 10)
for s.Scan() { lines = append(lines, s.Text()) }

答案3

得分: -1

你的代码中漏掉了调用Run()函数。以下是修复方法:

statement := "find \"CurrentDirectory\" -print | grep -i hello.go"
cmd := exec.Command("bash", "-c", statement)
err := cmd.Run()
if err != nil {
    // 处理错误
}
result, error := cmd.Output()

另外,为什么不使用os.Walk()呢?

英文:

You have missed calling Run() in your code. Here is how to fix it:

statement:= "find "CurrentDirectory" -print | grep -i hello.go"
cmd := exec.Command("bash", "-c", statement)
err := cmd.Run()
if err != nil {
    ...
}
result, error := cmd.Output()

P.S. Why not to use os.Walk()?

huangapple
  • 本文由 发表于 2022年2月23日 11:37:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/71231107.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定