Go Language Tutorial
In Go programming, Command function from exec module (needs to import os/exec module) is available to run the external command.
package main import ( "fmt" "os/exec" ) func RunCommand(cmd string) (string, error) { cmdOutput, err := exec.Command(cmd).Output() if err == nil { return string(cmdOutput), nil } return "", err } func main() { fmt.Println("Running command output from go code!") cmd := "date" result, _ := RunCommand(cmd) fmt.Println(result) }
Output:
$ go build external-command.go $ ./external-command Running command output from go code! Fri Dec 14 21:27:07 IST 2018
Output function returns bytes format for the output of executed command.
here string function is used to convert bytes result into string data type.
strings.Trim function can be used to remove leading and trailing unwanted characters in the command output.
Modifying above code to get only actual command output.
package main import ( "fmt" "os/exec" "strings" ) func RunCommand(cmd string) (string, error) { cmdOutput, err := exec.Command(cmd).Output() if err == nil { return strings.Trim(string(cmdOutput), " \n"), nil } return "", err } func main() { fmt.Println("Running command output from go code!") cmd := "date" result, _ := RunCommand(cmd) fmt.Println(result) }
Output:
$ go build external-command.go $ ./external-command Running command output from go code! Fri Dec 14 21:43:12 IST 2018
Suppose command contains multiple words like "go version", above code raises the error as 'exec: "go version": executable file not found in $PATH'
package main import ( "fmt" "os/exec" "strings" ) func RunCommand(cmd string) (string, error) { cmdOutput, err := exec.Command(cmd).Output() if err == nil { return strings.Trim(string(cmdOutput), " \n"), nil } return "", err } func main() { fmt.Println("Running command output from go code!") cmd := "go version" _, err := RunCommand(cmd) fmt.Println(err) }
Output:
$ go build external-command.go $ ./external-command Running command output from go code! exec: "go version": executable file not found in $PATH
Following go code addresses to fix the executable file not found in $PATH issue.
package main import ( "fmt" "os/exec" "strings" ) func RunCommand(cmd string) (string, error) { cmdOutput, err := exec.Command("sh", "-c", cmd).Output() if err == nil { return strings.Trim(string(cmdOutput), " \n"), nil } return "", err } func main() { fmt.Println("Running command output from go code!") cmd := "go version" result, _ := RunCommand(cmd) fmt.Println(result) }
Output:
$ ./external-command Running command output from go code! go version go1.6.4 linux/amd64
sudo command is also executed in Go code as like below sample code to read bios information.
package main import ( "fmt" "os/exec" "strings" ) func RunCommand(cmd string) (string, error) { cmdOutput, err := exec.Command("sh", "-c", cmd).Output() if err == nil { return strings.Trim(string(cmdOutput), " \n"), nil } return "", err } func main() { fmt.Println("Running command output from go code!") cmd := "sudo dmidecode -t bios" result, err := RunCommand(cmd) if err == nil { fmt.Println(result) return } fmt.Println(err.Error()) }
Output:,/p>
$ go build external-command.go $ ./external-command Running command output from go code! # dmidecode 3.0 Getting SMBIOS data from sysfs. SMBIOS 2.7 present. Handle 0x0029, DMI type 13, 22 bytes BIOS Language Information Language Description Format: Abbreviated Installable Languages: 1 en-US Currently Installed Language: en-US Handle 0x003F, DMI type 0, 24 bytes BIOS Information Vendor: ##### Version: ##### Release Date: 05/18/2016 Address: ##### Runtime Size: 128 kB ROM Size: 12288 kB Characteristics: PCI is supported PNP is supported BIOS is upgradeable BIOS shadowing is allowed Boot from CD is supported Selectable boot is supported ACPI is supported USB legacy is supported BIOS boot specification is supported Targeted content distribution is supported UEFI is supported BIOS Revision: 2.38 Firmware Revision: 1.12« Previous Next »