英文:
How to create an os.exec Command struct from a string with spaces
问题
我想让我的方法接收一个作为字符串的命令来执行。如果输入的字符串中有空格,我该如何将其拆分为用于 os.exec 的 cmd 和 args?
文档中说要像这样创建我的 Exec.Cmd 结构:
cmd := exec.Command("tr", "a-z", "A-Z")
这个方法可以正常工作:
a := string("ifconfig")
cmd := exec.Command(a)
output, err := cmd.CombinedOutput()
fmt.Println(output) // 打印 ifconfig 的输出
但是这个方法失败了:
a := string("ifconfig -a")
cmd := exec.Command(a)
output, err := cmd.CombinedOutput()
fmt.Println(output) // 打印 'ifconfig -a' 未找到
我尝试了 strings.Split(a),但收到一个错误消息:无法将 []string 类型用作 exec.Command 的参数中的 string 类型。
英文:
I want my method to receive a command to exec as a string. If the input string has spaces, how do I split it into cmd, args for os.exec?
The documentation says to create my Exec.Cmd struct like
cmd := exec.Command("tr", "a-z", "A-Z")
This works fine:
a := string("ifconfig")
cmd := exec.Command(a)
output, err := cmd.CombinedOutput()
fmt.Println(output) // prints ifconfig output
This fails:
a := string("ifconfig -a")
cmd := exec.Command(a)
output, err := cmd.CombinedOutput()
fmt.Println(output) // 'ifconfig -a' not found
I tried strings.Split(a), but receive an error message: cannot use (type []string) as type string in argument to exec.Command
答案1
得分: 17
args := strings.Fields("ifconfig -a ")
exec.Command(args[0], args[1:]...)
strings.Fields()函数根据空格分割字符串,并返回一个切片
...
将切片展开为单独的字符串参数
英文:
args := strings.Fields("ifconfig -a ")
exec.Command(args[0], args[1:]...)
strings.Fields() splits on whitespace, and returns a slice
...
expands slice into individual string arguments
答案2
得分: 8
请查看:
https://golang.org/pkg/os/exec/#example_Cmd_CombinedOutput
你的代码失败是因为exec.Command期望命令参数与实际的命令名称分开。
strings.Split的签名(https://golang.org/pkg/strings/#Split):
func Split(s, sep string) []string
你尝试实现的目标:
command := strings.Split("ifconfig -a", " ")
if len(command) < 2 {
// TODO: 处理错误
}
cmd := exec.Command(command[0], command[1:]...)
stdoutStderr, err := cmd.CombinedOutput()
if err != nil {
// TODO: 更优雅地处理错误
log.Fatal(err)
}
// 处理输出
fmt.Printf("%s\n", stdoutStderr)
英文:
Please, check out:
https://golang.org/pkg/os/exec/#example_Cmd_CombinedOutput
Your code fails because exec.Command expects command arguments to be separated from actual command name.
strings.Split signature (https://golang.org/pkg/strings/#Split):
func Split(s, sep string) []string
What you tried to achieve:
command := strings.Split("ifconfig -a", " ")
if len(command) < 2 {
// TODO: handle error
}
cmd := exec.Command(command[0], command[1:]...)
stdoutStderr, err := cmd.CombinedOutput()
if err != nil {
// TODO: handle error more gracefully
log.Fatal(err)
}
// do something with output
fmt.Printf("%s\n", stdoutStderr)
答案3
得分: 0
我喜欢这样使用exec.Command()
:
args := []string{
"-l",
fmt.Sprintf(xxxxx),
}
cmd := exec.Command("ls", args...)
cmd.Stdout = os.Stderr
cmd.Stderr = os.Stderr
英文:
I like to use the exec.Command()
like this:
args=[]string{
"-l",
fmt.Sprintf(xxxxx),
}
cmd := exec.Command("ls", args...)
cmd.Stdout = os.Stderr
cmd.Stderr = os.Stderr
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论