티스토리 뷰

golang

exec.Command() 간단 활용

fistful 2021. 2. 18. 17:54
반응형

exec 패키지를 이용하면 Go 프로그램 내에서 외부의 프로그램을 실행할 있다.

깊이 들어가서 파헤치지는 않았으며 간단한 사용법 몇몇을 알아보자.

 

예제 링크: https://play.golang.org/p/GTbfAx2lCTM

 

간단한 실행이다. $ls -al  실행한 것이다.

 

1) cmd  만들고

2) cmd Run  것이다. 

 

그런데 아무런 결과도 출력되지 않는다. 

Go 프로그램은   없지만 별도의 스레드에서 실행이 되고  스레드의 os.Stdout으로 출력되고 끝난 것이다.

 

예제 링크: https://play.golang.org/p/16DdYm5nkjn

 

cmd.Stdout = os.Stdout  줄만 적어주면 해당 command 실행된 스레드의 출력이 현재 Go 프로그램에서의 출력으로 나온다. 아래는 출력의 일부이다.

 

파이프의 사용

 

StackOverflow: https://bit.ly/3s3RYaW

 

하지만 이런 방식은 "|" (파이프) 없다. exec 패키지가 shell 고유기능인 파이프를 없는 것으로 보인다.

에러가 나진 않는데 dev 디렉토리 전체를 보여준다. 원하는 동작이 아니다.

 

예제: https://play.golang.org/p/4P1M_kdY-y0

아래는 출력의 일부

 

대응 방안

 

가지 방법이 있다.

 

1) exec 패키지가 지원하는 파이프를 이용하기

2) bash -c 이용하기

 

대응 방안 1 - 파이프 이용하기

예제링크: https://play.golang.org/p/0WkyblFWf1Y

 

들여다 보면 간단하다.

 

1) ls -al 명령이 있고

2) grep dev 명령이 있는데

3) ls -al 명령의 결과를 grep dev 쪽으로 파이프 연결을 해주는 것이다.

 

코드를 보면

1)  개의 명령을 만들어준 다음에

2) lsCmd StdoutPipe  grepCmd  Stdin 으로 넣어준 것이다.

3)  다음에 grepCmd.Start()  먼저 해주고

4) lsCmd.Run() 해준다. 그리고 grepCmd.Wait() 으로 기다려주면 된다.

 

그런데 위의 방식에서는 dev 폴더내용이  나왔는데

여기서는 원했던대로 ls -al standard out 중에서 dev  있는 줄을 추출해준다.

 

대응 방안 2 - -c 옵션 쓰기

예제 링크: https://play.golang.org/p/pyCQk7Hgb26

 

쉘을 쓰겠다고만 하면 된다.

결국 $sh -c ls -al | grep dev 라고 실행한 것과 같다.

 

참고: Android OS

 

Android OS 7.1.2 에서 개발중인데 시스템 power 내리려고

$svc power shutdown 이라는 명령을 내렸더니 실행이 되지 않고 에러가 났다.

결국 여러 시행착오 끝에  cmd := exec.Command("sh", "-c", "svc power shutdown") 같이 구현하였더니 실행이 되었다.

반응형
댓글
댓글쓰기 폼