어느덧 리눅스 기초 시리즈가 14번째 시간에 접어들었습니다. 지난 시간에는 터미널의 블랙박스인 history를 통해 과거의 나를 만났다면, 오늘은 현재 내 명령어가 어디서 실행되고 있는지를 찾아내는 탐정 놀이를 해보려 합니다.
리눅스 환경에서 Flutter나 Python, 혹은 Java 같은 개발 도구를 다루다 보면 "분명 설치했는데 왜 실행이 안 되지?"라거나 "내가 지금 쓰고 있는 게 정식 버전이 맞나?" 하는 의구심이 들 때가 있습니다. 오늘은 실행 파일의 행방을 쫓는 두 가지 필살기, **which**와 whereis 활용기를 공유합니다.
1. 나의 경험담: "중복 설치의 늪에서 길을 잃다"
최근 WSL2 우분투 환경에서 Flutter 개발 환경을 다시 세팅할 때의 일입니다. 예전에 설치해둔 버전과 새로 내려받은 버전이 꼬이면서, 분명히 최신 버전 폴더에서 작업을 하고 있는데 정작 빌드는 구버전 엔진으로 돌아가는 기괴한 현상을 겪었습니다.
범인은 환경 변수($PATH)였습니다. 여러 경로에 같은 이름의 flutter 명령어가 존재했고, 시스템은 제가 원치 않는 엉뚱한 경로의 파일을 먼저 실행하고 있었죠. 이때 저를 구원해 준 것이 바로 which 명령어였습니다. 명령어 한 줄로 지금 당장 실행되는 '진짜'의 정체를 밝혀냈을 때의 그 명쾌함이란!
2. which: "지금 당장 실행되는 놈, 누구야?"
**which**는 환경 변수($PATH)에 등록된 경로들을 뒤져서, 여러분이 명령어를 입력했을 때 실제로 실행되는 파일의 절대 경로를 딱 하나만 보여줍니다.
실험 코드: 실행 경로 확인하기
# 1. 지금 실행되는 파이썬은 어디에 있을까?
which python3
# 2. 플러터 실행 파일의 정체 확인
which flutter
# 3. 만약 결과가 아무것도 안 나온다면?
# -> 해당 명령어는 $PATH에 등록되어 있지 않다는 뜻입니다.
💡 유용한 팁: which -a 명령어를 사용하면 $PATH 내에 존재하는 동일한 이름의 모든 경로를 다 보여줍니다. 중복 설치 여부를 확인할 때 최고입니다.
3. whereis: "너에 대한 모든 기록을 가져와"
which가 현재 실행되는 '단 하나'에 집중한다면, **whereis**는 조금 더 포괄적인 수사관입니다. 실행 파일(Binary)뿐만 아니라, 해당 명령어의 소스 코드 위치와 매뉴얼(man page) 파일의 위치까지 싹 다 긁어모아서 보여줍니다.
실험 코드: 관련 파일 싹 다 찾기
# 파이썬과 관련된 모든 경로를 수색해!
whereis python3
# 출력 예시:
# python3: /usr/bin/python3 /usr/lib/python3 /usr/share/man/man1/python3.1.gz
(▲ Action: whereis를 사용하면 단순한 실행 파일 위치뿐만 아니라, 시스템 내부에서 이 명령어가 어떤 구조로 관리되고 있는지 한눈에 파악할 수 있습니다.)
4. which vs whereis: 무엇이 다른가요?
리눅스 초보자가 가장 많이 헷갈려 하는 두 명령어의 차이점을 표로 정리해 보았습니다.
| 비교 항목 | which | whereis |
| 주요 목적 | 현재 실행되는 파일의 위치 확인 | 실행 파일, 소스, 매뉴얼 위치 확인 |
| 검색 범위 | 오직 $PATH 내의 경로 | 표준 리눅스 디렉토리 전체 (더 넓음) |
| 검색 결과 | 가장 먼저 발견된 1개 (기본) | 발견된 모든 관련 경로 |
| 추천 상황 | "내 명령어가 어디서 돌아가는 거지?" | "이 프로그램 관련 파일들이 어디 있지?" |
5. After: 환경 변수($PATH)의 이해
이 두 명령어를 잘 쓰려면 리눅스의 **환경 변수($PATH)** 개념을 이해해야 합니다. 리눅스는 명령어를 입력받으면 $PATH\라는 리스트에 적힌 폴더들을 순서대로 뒤져서 가장 먼저 찾은 파일을 실행합니다.
(▲ After: which로 찾은 경로가 내가 원하는 경로가 아니라면, 우리는 .bashrc나 .zshrc 파일을 열어 $PATH의 순서를 조정해야 합니다. 이것이 바로 리눅스 개발 환경 최적화의 핵심입니다.)
6. 마치며: 위치를 아는 것이 통제의 시작이다
리눅스를 잘 다루는 사람은 명령어를 많이 아는 사람이 아니라, 명령어가 시스템 안에서 어떻게 흐르는지 이해하는 사람입니다. which와 whereis는 여러분이 설치한 수많은 도구가 미로 같은 폴더 속 어디에 박혀 있는지 알려주는 든든한 가이드가 되어줄 것입니다.
오늘의 인사이트: "명령어가 내 뜻대로 작동하지 않는다면, 의심하지 말고 위치부터 물어봐라."
이제 내 도구들이 어디 있는지 확인하는 법을 배웠으니, 다음 시간에는 시스템의 정보를 한눈에 훑어보는 **uname**과 hostname 명령어에 대해 다뤄보겠습니다.
이 포스팅이 도움이 되셨나요? 제 블로그 sunyjini.com에서는 실제 개발 현장에서 겪는 생생한 IT 이야기와 리눅스 생존기를 매일 공유하고 있습니다. 궁금한 점은 언제든 댓글로 남겨주세요!
혹시 특정 명령어가 위치한 폴더로 바로 이동하고 싶으신가요? cd $(dirname $(which flutter)) 같은 마법의 조합이 궁금하시다면 댓글로 알려주세요!
'IT' 카테고리의 다른 글
| [리눅스 기초 #16] "응답 없는 너를 보내며" : top과 kill로 폭주하는 프로세스 진압하기 (0) | 2026.01.30 |
|---|---|
| [리눅스 기초 #15] "너는 누구냐?" : uname과 hostname으로 시스템 정체성 확인하기 (1) | 2026.01.29 |
| [리눅스 기초 #13] "어제 쓴 그 명령어 뭐였지?" : history로 기억력을 해킹하는 법 (0) | 2026.01.29 |
| [리눅스 기초 #12] 귀차니즘이 만든 혁명: alias로 나만의 비밀 명령어 만들기 (0) | 2026.01.28 |
| [리눅스 기초 #11] "내 컴퓨터에선 됐는데?" : 도커(Docker)로 환경 문제 완벽하게 끝내기 (0) | 2026.01.28 |