问题
执行
out, err := exec.Command("grep 172.0.0.1 ~/.ssh/known_hosts | wc -l").Output()
返回RT错误
原因
exec包
func Command(name string, arg ...string) *Cmd
name参数一定要注意
If name contains no path separators, Command uses LookPath to resolve name to a complete path if possible. Otherwise it uses name directly as Path.
name不要写整条命令!!!
name不要写整条命令!!!
name不要写整条命令!!!
重要的事情说三遍
解决办法
第一个name参数是命令的名字或路径,参数一定要挨个传入
out, err := exec.Command("grep", "172.0.0.1", "~/.ssh/known_hosts").Output()
out, err = exec.Command("wc", "-l", "~/.ssh/known_hosts").Output()
如果是多命令,写成脚本 grep.sh
out, err := exec.Command("sh", "grep.sh").Output()
golang官宣
Command returns the Cmd struct to execute the named program with the given arguments.
It sets only the Path and Args in the returned structure.
If name contains no path separators, Command uses LookPath to resolve name to a complete path if possible. Otherwise it uses name directly as Path.
The returned Cmd’s Args field is constructed from the command name followed by the elements of arg, so arg should not include the command name itself. For example, Command(“echo”, “hello”). Args[0] is always name, not the possibly resolved Path.
On Windows, processes receive the whole command line as a single string and do their own parsing. Command combines and quotes Args into a command line string with an algorithm compatible with applications using CommandLineToArgvW (which is the most common way). Notable exceptions are msiexec.exe and cmd.exe (and thus, all batch files), which have a different unquoting algorithm. In these or other similar cases, you can do the quoting yourself and provide the full command line in SysProcAttr.CmdLine, leaving Args empty.
package main
import (
"bytes"
"fmt"
"log"
"os/exec"
"strings"
)
func main() {
cmd := exec.Command("tr", "a-z", "A-Z")
cmd.Stdin = strings.NewReader("some input")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
log.Fatal(err)
}
fmt.Printf("in all caps: %q\n", out.String())
}
package main
import (
"log"
"os"
"os/exec"
)
func main() {
cmd := exec.Command("prog")
cmd.Env = append(os.Environ(),
"FOO=duplicate_value", // ignored
"FOO=actual_value", // this value is used
)
if err := cmd.Run(); err != nil {
log.Fatal(err)
}
}
在使用Golang的`exec.Command`时遇到'no such file or directory'错误。问题源于`name`参数不应包含完整命令路径。解决办法是确保`name`仅包含命令名,其余参数应单独传递。在Windows上,需注意不同应用可能有不同的命令行解析算法,可能需要手动处理引号。
1154

被折叠的 条评论
为什么被折叠?



