当前位置: 首页 > 面试题库 >

如何使用未知参数执行系统命令

卫招
2023-03-14
问题内容

我有一堆系统命令,它们与将新内容附加到文件非常相似。我编写了一个简单的脚本来执行系统命令,如果存在诸如“ ls”,“
date”等单个单词,该脚本就可以很好地工作。但是如果命令大于此范围,则程序将死亡。

以下是代码

package main

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

func exe_cmd(cmd string, wg *sync.WaitGroup) {
    fmt.Println(cmd)
    c = cmd.Str
    out, err := exec.Command(cmd).Output()
    if err != nil {
        fmt.Println("error occured")
        fmt.Printf("%s", err)
    }
    fmt.Printf("%s", out)
    wg.Done()
}

func main() {
    wg := new(sync.WaitGroup)
    wg.Add(3)

    x := []string{"echo newline >> foo.o", "echo newline >> f1.o", "echo newline >> f2.o"}
    go exe_cmd(x[0], wg)
    go exe_cmd(x[1], wg)
    go exe_cmd(x[2], wg)

    wg.Wait()
}

以下是我看到的错误

exec: "echo newline >> foo.o": executable file not found in $PATHexec: 
"echo newline >> f2.o": executable file not found in $PATHexec: 
"echo newline >> f1.o": executable file not found in $PATH

我想,这可能是由于未单独发送cmds和参数(http://golang.org/pkg/os/exec/#Command)导致的。我想知道如何颠覆这个问题,因为我不知道命令中将要执行多少个参数。


问题答案:

我找到了实现这一目标的相对体面的方法。

out, err := exec.Command("sh","-c",cmd).Output()

直到现在为我工作。仍在寻找更好的方法来实现这一目标。

编辑1:

最后,一个更简单,有效(到目前为止)的方法是这样的

func exe_cmd(cmd string, wg *sync.WaitGroup) {
  fmt.Println("command is ",cmd)
  // splitting head => g++ parts => rest of the command
  parts := strings.Fields(cmd)
  head := parts[0]
  parts = parts[1:len(parts)]

  out, err := exec.Command(head,parts...).Output()
  if err != nil {
    fmt.Printf("%s", err)
  }
  fmt.Printf("%s", out)
  wg.Done() // Need to signal to waitgroup that this goroutine is done
}

多亏了go中各种各样的争论以及向我指出的人:)



 类似资料:
  • 问题内容: 在下面的程序中,名称为“ don”,因此该命令将搜索活动目录,其所有名称均以don开头(例如donald等)。但是从读者对象分配后,line2变量变为空,并且永远不会进入循环。我究竟做错了什么?仅供参考:当我在命令行上输入命令时,该命令有效。 问题答案: 如果我没记错的话,管道(或重定向)需要使用cmd.exe启动程序。就像是:

  • 问题内容: 我试图便宜一些,并在Java中执行本地系统命令()。我想从中获取输出并将其存储在String中。最好的方法是什么?当前代码: 问题答案: 你的方法与我可能要做的事情并不遥远: 当然,请处理你关心的任何异常情况。

  • 问题内容: 我需要在 node.js 函数中 它将 同步 执行给定的命令行并返回该命令文本的所有标准输出。 ps。同步是错误的。我知道。仅供个人使用。 更新 现在我们有了mgutz的解决方案,该解决方案为我们提供了退出代码,但没有stdout!仍在等待更准确的答案。 问题答案: Node.js(从0.12版本开始-已有一段时间)支持: 您现在可以直接执行以下操作: 它会做您期望的。(默认将I /O

  • 最近许多小伙伴遇到ssh命令不知道怎么执行, 过来找我解决。 我将各个系统如何打开终端的方法汇总如下,希望能帮到各位! Windows 10 Windows 7 Ubuntu macOS Windows 10 在Windows 10 系统中的Powershell 命令提示符窗口比CMD窗口功能强大的多, 并且内置ssh 命令,下面教如何打开Powershell。 使用快捷键 Win + R打开运行

  • 问题内容: 我正在尝试生成一个执行系统命令的进程,而我自己的程序仍然继续运行,并且两个进程将并行运行。我在linux上工作。 我在网上查了一下,听起来应该使用exec()系列。但这并不完全符合我的预期。例如,在下面的代码中,我只看到“ before”被打印,而没有看到“ done”。 我很好奇我是否在撒东西? [更新] 谢谢你们的评论。现在我的程序看起来像这样。除了最后,一切正常,我必须按Ente

  • 11.6 执行系统命令 许多批处理作业可能需要一个外部命令调用内部的批处理作业.这样一个过程可以分开调度,但常见的元数据对运行的优势将会丢失.此外,multi-step 作业需要分割成多个作业. 因此通常的 spring batch提供一个tasklet实现调用系统命令: <bean class="org.springframework.batch.core.step.tasklet.System