이번 시간에는 리눅스 which 명령어를 알아보겠습니다.

 


 which는 command의 위치를 알려줍니다. 예를 들어 java라던지, ls와 같은 것들의 명령어 위치를 알려줍니다.

 

 제 서버에는 java가 설치되어 있지 않습니다. 그렇기 때문에 처음에 which java를 입력하면 아무 것도 나오지 않습니다. java를 설치하고 나서, 다시 which java를 입력해 보겠습니다.

 

 

 그러면, /usr/bin/java에 설치되었다고 나옵니다.

 

 

 ls로 상세 정보를 보면, 링크 파일임을 알 수 있습니다. 이들을 통해서 따라 들어가 봅시다. 먼저, java가 /etc/alternatives/java의 링크임을 알 수 있어요. /etc/alternatives로 들어가 봅시다.

 

 

 그러면 java가 있을 텐데요. java가 /usr/lib/jvm/java-17-openjdk-amd64/bin/java를 가리키고 있음을 볼 수 있어요. bin 경로로 들어가 보겠습니다.

 

 

 그러면 이제서야 java 실행파일이 나옵니다. 여기서, 중간에 끼어 있는 부분이 /etc/alternatives인데요.

 

 

 update-alternatives --config java를 입력하면 어떤 대체 버전을 선택할 것인지를 물어봅니다. 1번을 선택해 볼까요?

 

 

 그러고 나서 다시 /etc/alternatives에 가 보면, java가 가리키는 것이 java-11-openjdk-amd64/bin/java임을 알 수 있습니다. 결국, /etc/alternatives는 어떤 버전을 선택했느냐에 따라서 실행하는 파일을 다르게 하는 중개자 역할을 한 셈입니다.

 


 ls나 cmp 같은 명령어의 위치도 쉽게 찾을 수 있습니다. ls는 /usr/bin/ls에, cmp는 /usr/bin/cmp에 있다고 하네요.

 

 

 실제로 /usr/bin에 들어가 보면, ls가 있음을 볼 수 있어요. 그러면 ls 명령어를 쳤을 때 실제로 어떤 실행 파일을 실행시킬까요? 이건, strace로 어렵지 않게 볼 수 있는데요.

 

 

 첫 줄에 execve가 보입니다. 그리고 1번째 인자로 "/usr/bin/ls"가 보이는데요. 이는 /usr/bin/ls를 실행시켰다는 것을 의미합니다.