
Dando continuidade a Série Go veremos que executar comandos da shell com e obter conteúdo de variáveis de ambiente Go.
Para executar comandos da shell, você pode usar o pacote os/exec, que fornece funcionalidades para criar, executar e manipular comandos externos. Aqui está um exemplo de como executar um comando da shell e capturar sua saída:
package main
import (
    "fmt"
    "os/exec"
)
func main() {
    // Comando a ser executado (exemplo: "ls -l")
    cmd := exec.Command("ls", "-l")
    // Executa o comando e captura a saída
    output, err := cmd.Output()
    if err != nil {
        fmt.Println("Erro ao executar o comando:", err)
        return
    }
    // Imprime a saída do comando
    fmt.Println(string(output))
}Neste exemplo, o comando ls -l é executado e a saída é capturada e impressa. Vamos detalhar os passos:
Criação do Comando:
cmd := exec.Command("ls", "-l")Aqui, exec.Command cria um comando para ser executado. O primeiro argumento é o nome do comando (ls) e os demais são os argumentos do comando (-l).
Execução do Comando e Captura da Saída:
output, err := cmd.Output()
cmd.Output() executa o comando e captura sua saída padrão. Se houver algum erro durante a execução, ele será retornado em err.Tratamento de Erro:
if err != nil {
    fmt.Println("Erro ao executar o comando:", err)
    return
}Se ocorrer um erro, ele é impresso e a função retorna.
Impressão da Saída:
fmt.Println(string(output))A saída capturada, que é um slice de bytes, é convertida para string e impressa.
Se você precisar de mais controle sobre o comando, como separar a saída padrão e a saída de erro, pode usar os métodos cmd.StdoutPipe e cmd.StderrPipe. Aqui está um exemplo:
package main
import (
    "fmt"
    "io"
    "os"
    "os/exec"
)
func main() {
    // Comando a ser executado (exemplo: "ls -l")
    cmd := exec.Command("ls", "-l")
    // Obtém os pipes para stdout e stderr
    stdout, err := cmd.StdoutPipe()
    if err != nil {
        fmt.Println("Erro ao obter o pipe stdout:", err)
        return
    }
    stderr, err := cmd.StderrPipe()
    if err != nil {
        fmt.Println("Erro ao obter o pipe stderr:", err)
        return
    }
    // Inicia o comando
    if err := cmd.Start(); err != nil {
        fmt.Println("Erro ao iniciar o comando:", err)
        return
    }
    // Lê e imprime stdout
    go func() {
        if _, err := io.Copy(os.Stdout, stdout); err != nil {
            fmt.Println("Erro ao copiar stdout:", err)
        }
    }()
    // Lê e imprime stderr
    go func() {
        if _, err := io.Copy(os.Stderr, stderr); err != nil {
            fmt.Println("Erro ao copiar stderr:", err)
        }
    }()
    // Espera pelo término do comando
    if err := cmd.Wait(); err != nil {
        fmt.Println("Erro ao esperar pelo comando:", err)
    }
}Neste exemplo, o comando ls -l é executado novamente, mas a saída padrão e a saída de erro são lidas e impressas separadamente em goroutines, proporcionando mais flexibilidade na manipulação da saída do comando.
Nesse exemplo básico obteremos o conteúdo da variável $PATH:
package main
import (
	"fmt"
	"os"
)
func main() {
	valor, existe := os.LookupEnv("SHELL")
	if existe {
		fmt.Println("Valor:", valor)
	} else {
		fmt.Println("Variável não encontrada")
	}
}Até o próximo artigo da série!