티스토리 뷰
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") 와 같이 구현하였더니 실행이 되었다.
'golang' 카테고리의 다른 글
코로나 바이러스 확진자 동향 3주간 비교 - 데이터를 먹기좋게 요리하기 (0) | 2021.03.03 |
---|---|
코로나 바이러스 확진자 동향 3주간 비교 - 공공데이터 오픈API (0) | 2021.03.02 |
Go 슬라이스 가지고 놀아보자 (0) | 2020.10.21 |
Go: 필드가 많은 구조체의 marshaling/unmarshaling (0) | 2020.09.19 |
WSL2 에서 gvm 사용하기 (Go Version Manager) (0) | 2020.09.13 |
- Total
- Today
- Yesterday
- Gin
- API
- 영화
- postgres
- go
- OpenAI
- 노션
- notion
- intellij
- 잡학툰
- folklore
- websocket
- pool
- 제이펍
- 2023
- Shortcut
- 클린 애자일
- 독서
- strange
- solid
- 체호프
- JIRA
- 인텔리제이
- github
- bun
- Bug
- agile
- golang
- ChatGPT
- 독서후기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |