프로그래밍 하다보면 .. command line 명령으로 외부 파일을 실행해야할때가 있습니다. 그런때 exe.Command 를 사용하는데요 약간의 추가적인 부분 몇가지를 적어봅니다.
Go
/**
* execCommandStart
**/
func execCommandStart(name string, arg ...string) error {
cmd := exec.Command(name, arg...)
err := cmd.Start()
return err
}
/**
* execCommandRun
**/
func execCommandRun(name string, arg ...string) error {
cmd := exec.Command(name, arg...)
err := cmd.Run()
return err
}
/**
* execCommandOutput
**/
func execCommandOutput(name string, arg ...string) (string, error) {
cmd := exec.Command(name, arg...)
output, err := cmd.CombinedOutput()
return string(output), err
}기본적으로 exec.Command 에 보통 많이 쓰는게 Run , Start 인데요 이 둘의 차이점은 Run 은 실행시킨 왜부 파일의 실행이 종료 될때까지 리턴되지 않습니다. Start 는 종료 여부 상관없이 바로 리턴됩니다.
execCommandOutput 함수는 .. 실행한 외부명령이 출력하는 데이터를 받아줍니다.
한가지 추가적인 팁을 주자면 ..
Go
/**
* execCommandStart
**/
func execCommandStart(name string, arg ...string) error {
cmd := exec.Command(name, arg...)
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
err := cmd.Start()
return err
}
/**
* execCommandRun
**/
func execCommandRun(name string, arg ...string) error {
cmd := exec.Command(name, arg...)
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
err := cmd.Run()
return err
}
/**
* execCommandOutput
**/
func execCommandOutput(name string, arg ...string) (string, error) {
cmd := exec.Command(name, arg...)
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
output, err := cmd.CombinedOutput()
return string(output), err
}콘솔모드 프로그램을 실행시 검은 콘솔창이 뜨는것이 싫으시면
Go
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}이렇게 속성을 추가로 지정하시면 됩니다. HideWindow 는 Go로 윈도용 프로그램을 만들때만 해당됩니다. 다른 OS는 상관 없습니다.
마지막으로 .. 윈도의 기본 실행파일들.. 예를들어 ipconfig 라던지 net 같은 명령어들을 사용할 경우에 보통 Path 로 환경변수가 잡혀 있어야 하지만 .. 이 부분이 손상(?) 된 경우에 실행파일을 찾을 수 없게 됩니다. 이런 경우를 대비하자면 이 함수들에서 외부 명령 실행시에 직접적으로 환경변수 지정이 가능합니다.
Go
/**
* execCommandStart
**/
func execCommandStart(name string, arg ...string) error {
cmd := exec.Command(name, arg...)
cmd.Env = append(os.Environ(), "Path=C:\\Windows\\system32;C:\\Windows")
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
err := cmd.Start()
return err
}
/**
* execCommandRun
**/
func execCommandRun(name string, arg ...string) error {
cmd := exec.Command(name, arg...)
cmd.Env = append(os.Environ(), "Path=C:\\Windows\\system32;C:\\Windows")
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
err := cmd.Run()
return err
}
/**
* execCommandOutput
**/
func execCommandOutput(name string, arg ...string) (string, error) {
cmd := exec.Command(name, arg...)
cmd.Env = append(os.Environ(), "Path=C:\\Windows\\system32;C:\\Windows")
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
output, err := cmd.CombinedOutput()
return string(output), err
}Env 값에 기본 환경변수에 추가하여 추가적으로 Windows\System32, Windows 폴더를 지정했습니다. 필요에 따라 변형해 사용하시면 됩니다.