이 튜토리얼에서는 간단한 예제를 통해 리눅스에서 which 명령어를 사용하는 방법을 알아봅니다.
which 명령어는 시스템에 존재하는 특정 명령어가 실제로 어떤 실행 파일을 호출하는지 그 경로를 알려줍니다.
왜 유용할까요? 예를 들어, 시스템에 MySQL 실행 파일이 서로 다른 방식으로 설치되어 두 개의 복사본이 존재한다고 가정해 봅시다. 이때 실제로 사용 중인 것이 어느 것인지 파악해 나머지 하나를 삭제하고 싶다면, which 명령어를 활용하면 됩니다. 터미널에서 MySQL을 실행할 때 두 실행 파일 중 어떤 것이 호출되는지 정확히 확인할 수 있습니다.
리눅스 which 명령어 기본 문법
which 명령어의 기본 구문은 다음과 같습니다.
which OPTIONS COMMAND
각 요소는 다음과 같습니다.
- OPTIONS: 아래 표에서 선택적으로 지정할 수 있는 옵션 목록으로, which 명령어의 기본 동작을 변경하는 데 사용됩니다.
- COMMAND: 실행 파일 경로를 확인하고자 하는 명령어의 이름입니다.
- COMMAND는 반드시 입력해야 합니다. 입력하지 않으면 which가 검색할 대상이 없습니다!
주요 옵션
which 명령어와 함께 자주 사용되는 옵션은 다음과 같습니다.
| 옵션 | 설명 |
|---|---|
| --all, -a | PATH에서 일치하는 모든 실행 파일을 출력합니다. 첫 번째 결과만 보여주는 기본 동작과 달리 전체를 표시합니다. |
| --read-alias, -i | 표준 입력(stdin)으로부터 별칭(alias)을 읽어 일치하는 항목을 표준 출력(stdout)으로 보고합니다. which 자체에 별칭을 설정해 사용하는 경우 유용합니다. |
| --skip-alias | --read-alias 옵션을 무시합니다. which에 대한 별칭이나 함수 내에서 --read-alias를 사용 중일 때, 일반 바이너리만 명시적으로 검색하고 싶은 경우 유용합니다. |
| --read-functions | 표준 입력으로부터 셸 함수 정의를 읽어 일치하는 항목을 표준 출력으로 보고합니다. which 자체를 셸 함수로 정의해 사용하는 경우 유용합니다. |
| --skip-functions | --read-functions 옵션을 무시합니다. 별칭이나 함수 내에서 --read-functions를 사용 중일 때, 일반 바이너리만 명시적으로 검색하고 싶은 경우 유용합니다. |
그리고 언제나처럼 다음 명령어를 실행하면 which 명령어의 전체 사용자 매뉴얼을 확인할 수 있습니다.
man which
which 명령어 사용 예제
아래 예제는 터미널에서 nano를 실행했을 때 호출되는 실행 파일의 경로를 찾는 방법입니다.
which nano
시스템에 nano 텍스트 편집기가 설치되어 있다면 다음과 같은 결과가 반환됩니다.
/usr/bin/nano
반대로 nano가 설치되어 있지 않다면 아래와 같이 표시됩니다.
nano not found
이처럼 which 명령어는 실행 파일의 위치를 확인하는 용도뿐 아니라, 해당 패키지가 설치되어 있는지 또는 사용 가능한지 여부를 점검하는 데에도 활용할 수 있습니다.
여러 명령어를 한 번에 조회하고 싶다면 실행 파일 이름을 여러 개 함께 지정하면 됩니다.
which cat less
실행 결과는 다음과 같습니다.
/bin/cat /usr/bin/less
종료 코드(Return Codes) 활용하기
셸 스크립트에서 which를 사용할 때는 명령어가 반환하는 상태 코드를 통해 실행 파일 경로를 찾았는지 여부를 판단할 수 있습니다.
| 코드 | 의미 |
|---|---|
| 0 | 지정된 모든 명령어를 찾았으며, 실행 가능한 상태입니다. |
| 1 | 지정된 명령어 중 하나 이상을 찾지 못했거나 실행할 수 없습니다. |
| 2 | 잘못된 옵션이나 문법이 사용되었습니다. |
이 기능은 셸 스크립트의 이식성(portability)을 높이고자 할 때 특히 유용합니다. 스크립트 내에서 명령어를 실행하기 전에 which로 해당 명령어의 존재 여부를 먼저 확인하면, 필요한 소프트웨어가 설치되어 있지 않은 최종 사용자에게 오류가 발생하는 상황을 미리 방지할 수 있습니다.