본문으로 건너뛰기

외부 명령 실행하기( feat exec.Command )

프로그래밍 하다보면 .. 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 폴더를 지정했습니다. 필요에 따라 변형해 사용하시면 됩니다.