반응형
What is which?
which 가 무엇인가요?
- 리눅스 시스템에서 아주 유용하게 쓰이는 명령어 입니다.
- 터미널에서 which go 이런식으로 입력하면 그 실행파일의 path를 찾아주는 역할을 합니다.
- 상황 설명
- 내가 맨날 실행하던 fish 쉘 어디서 동작하는지 모를때 which fish 입력하면 /usr/bin/fish 이런식으로 찾아줍니다.
- 분명 패키지를 지웠는데 잘 실행되고 있는경우 확인하려고 할때
- 내가 go를 홈 디렉토리에서도 설치하고 패키지 매니저로도 설치하고 깃허브에서도 설치하고 한 상황에서 go get 한 파일들을 찾아보려고 할 때 (go env에서 go path를 찾아보아도 된다.)
- 내가 맨날 실행하던 fish 쉘 어디서 동작하는지 모를때 which fish 입력하면 /usr/bin/fish 이런식으로 찾아줍니다.
Go 에서 구현하기
Go에서 which 를 구현하면서 운영체제와 상호작용하는 방법을 살펴봅니다.

os 와 path/filepath 가 필요합니다.

os.Args에서 받은 인수를 arguments 에 저장합니다.
os.Args는 첫번째 인수를 현재 파일명으로 갖는데 len함수를 써서 인수가 입력되지 않으면 인수를 더 넣으라고 출력하는 부분입니다.

첫번째 커맨드라인 인수를 file 에 저장하고, PATH환경변수를 읽은다음 filepath.SplitList() 이용해서 경로들을 분리합니다.

막 요런거 있잖아요?

그리고 환경변수를 받아온것을 for 구문으로 돌면서 분리합니다.
fileInfo 는 파일이 존재하는지 확인하고
if mode.IsRegular 는 일반파일인지 확인
if mode&0111 은 실행파일인지 확인합니다.
filepath.Join() 을 이용해서 파일의 전체 경로를 만드는데 운영체제마다 다른 구분자를 사용해서 경로의 부분들을 합쳐주기 때문에 지원되는 모든 운영체제에서 잘 작동한다고 합니다.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"fmt" | |
"os" | |
"path/filepath" | |
) | |
func main() { | |
arguments := os.Args | |
if len(arguments) == 1 { | |
fmt.Println("Please provide an arguments!") | |
return | |
} | |
file := arguments[1] | |
path := os.Getenv("PATH") | |
pathSplit := filepath.SplitList(path) | |
for _, direcotry := range pathSplit { | |
fullPath := filepath.Join(direcotry, file) | |
fileInfo, err := os.Stat(fullPath) | |
if err == nil { | |
mode := fileInfo.Mode() | |
if mode.IsRegular() { | |
if mode&0o111 != 0 { | |
fmt.Println(fullPath) | |
return | |
} | |
} | |
} | |
} | |
} |
실행 해보기
which 명령어 대신 go run . which 입력한다.



심심한데 빌드시켜서 응용프로그램으로 써도 될거 같네요^^

반응형
'프로그래밍 > GO' 카테고리의 다른 글
Golang 초보 예제 프로그램 전화번호부 애플리케이션 개발 시리즈 Phone book program #1 beginner friendly (0) | 2023.02.28 |
---|---|
GO Generic 제네릭 짧게 알아봄 (0) | 2023.02.24 |
Getting started with multi-module workspaces 멀티 모듈 워크스페이스 (0) | 2023.02.22 |
모듈 호출하기 Call your code from another module (0) | 2023.02.21 |
모듈 만들기 creating a module (0) | 2023.02.21 |
댓글