2

I am trying to create a generic function in go that takes in input a shell command (with arguments) and execute it.

Note the shell commands may have a different number of arguments.

I understand that the exec.Command() in Go takes as input the format ("ls", "-la", "/var") for the command + arguments.

This code snipped below doesn't work:

func exe_cmd(commandarray []string) {
var shell_command string = ""
for i := 0; i < len(commandarray); i++ {
                  shell_command = shell_command + " " + commandarray[i]
                  }
cmd := exec.Command(shell_command)
fmt.Println("Command is: ", shell_command)
fmt.Printf("==> Executing: %s\n", strings.Join(cmd.Args, " "))
out, err := cmd.Output()
fmt.Printf("OutVar: %s\n", out)
fmt.Printf("ErrVar: %s\n", err)
}

func dummy() {
dummycmd := []string{"ls", "-la", "/var"}
exe_cmd(dummycmd)
}

A the end of the for the shell_command variable will contain "ls -la /var" and I am having a hard time to figure out how to form it in a way that is what the input format requires i.e. "ls", "-la", "/var"

I have also tried to set dummycmd as a variable with "ls -la /var" but I figure that was even worse if requirement is to pass it to the exec.Command in the format above.

Thoughts?

Thanks.

1 Answer 1

5

You can simply match the argument signature of the exec.Command function, which is

(name string, arg ...string)

And use the variadic syntax to pass the function argument along to exec.Command

func execCmd(name string, args ...string) {
    cmd := exec.Command(name, args...)

    fmt.Printf("Command is: %s, %s", name, args)

    out, err := cmd.Output()

    fmt.Printf("OutVar: %s\n", out)
    fmt.Printf("ErrVar: %s\n", err)
}

Note however, you're not invoking a shell here, so relying on any shell builtin's will fail.

Sign up to request clarification or add additional context in comments.

6 Comments

Thanks @JimB Mh... I am not sure I am following. I am trying to pass an array for args (which is what I was trying to do before including the actual command as first argument) but it complains that cannot use shell_commandArgs (type []string) as type string in argument to exec.Command.
Maybe I have misinterpreted what you were suggesting. Now I have created a string variable that contains ls and another string variable (not a slice) that contains -la /var. This works better and it executes but for some reasons it is misinterpreted (it exits 1 instead of listing the content of /var). With one argument only (e.g. -la it works just fine.
Every argument is separate. The full string "-la /var" isn't a valid argument to ls -- you want "-la", "/var".
Yes. agreed. That is part of the problem I am trying to solve. I am trying to build a generic function that can accept a variable number of arguments. I originally thought I could pass a slice that contains all the individual arguments and inside the function I'd concatenate them properly to pass them onto the exec.Command instruction.
@mreferre: You don't concatenate them, you can do just what I've shown here to pass any number of arguments. The exec_cmd function accepts a variadic number of arguments, and passes them all along to exec.Command.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.