Golang执行系统命令时遇到错误如何解决

Golang执行系统命令时遇到错误如何解决 大家好,我在通过Go运行命令时遇到以下错误: fork/exec awk ‘BEGIN{buf=""} /[0-9]:[0-9][0-9]:[0-9]/{buf=$0};/ORA-/{print buf,$0}’ /u02/app/oracle/admin/12.1.0.2/diag/rdbms/*******/******1/trace/alert_******1.log: 没有那个文件或目录

当我尝试手动运行它时,一切正常:

[oracle@cfcldx0139 adhoc]$ exec awk 'BEGIN{buf=""} /[0-9]:[0-9][0-9]:[0-9]/{buf=$0};/ORA-/{print buf,$0}' /u02/app/oracle/admin/12.1.0.2/diag/rdbms/*******/*******1/trace/alert_*****1.log

Fri Jul 10 08:03:10 2020 ORA-65000 signalled during: ALTER pluggable DATABASE CLOSE immediate…

代码如下:

search_cmd := "awk 'BEGIN{buf=""} /[0-9]:[0-9][0-9]:[0-9]/{buf=$0};/ORA-/{print buf,$0}' " + alert_file
cmd2 := exec.Command(search_cmd)

更多关于Golang执行系统命令时遇到错误如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复
exec.Command("bash", "-c", searchcmd).Start()

更多关于Golang执行系统命令时遇到错误如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


“search_cmd”究竟是什么?由于 Golang 的 exec 行为与 C 的 exec 类似,它可能仅限于 /bin 目录中的命令,因此可能无法找到您想要运行的二进制文件。

问题在于你直接将整个awk命令字符串传递给了exec.Command。在Go中执行系统命令时,第一个参数应该是命令本身,后续参数需要单独传递。以下是正确的实现方式:

search_cmd := "awk"
args := []string{
    "BEGIN{buf=\"\"} /[0-9]:[0-9][0-9]:[0-9]/{buf=$0};/ORA-/{print buf,$0}",
    alert_file,
}
cmd2 := exec.Command(search_cmd, args...)

或者更清晰的写法:

awkScript := "BEGIN{buf=\"\"} /[0-9]:[0-9][0-9]:[0-9]/{buf=$0};/ORA-/{print buf,$0}"
cmd2 := exec.Command("awk", awkScript, alert_file)

这样Go会正确地将awk作为命令执行,并将脚本和文件路径作为参数传递,避免"没有那个文件或目录"的错误。

回到顶部